Hive 解析数组<;字符串>;在配置单元中使用OPEN CSV SEREDE
我得到的数据格式如下: 100 | 15 | N-PS-GL-PSJOB |1,A | JFGLFX48|“AAAA”|102 100 | 15 | N-PS-GL-PSJOB |2,A | JFGLFX48|“AAEE”|102 100 | 15 | N-PS-GL-PSJOB |1,A | JFGLFX48|“AXXX”|102 100 | 15 | N-PS-GL-PSJOB |2,A | JFGLFX48|“ABCH”|102 我需要实施Hive 解析数组<;字符串>;在配置单元中使用OPEN CSV SEREDE,hive,Hive,我得到的数据格式如下: 100 | 15 | N-PS-GL-PSJOB |1,A | JFGLFX48|“AAAA”|102 100 | 15 | N-PS-GL-PSJOB |2,A | JFGLFX48|“AAEE”|102 100 | 15 | N-PS-GL-PSJOB |1,A | JFGLFX48|“AXXX”|102 100 | 15 | N-PS-GL-PSJOB |2,A | JFGLFX48|“ABCH”|102 我需要实施 使用“|”进行分析,并使用“”和“ 删除引号 我
Surya有几种方法可以解决这个问题。最好的选择是在蜂巢着陆表中预处理此数据,然后将生成的数据加载到目标蜂巢表,该表可能是ORC/拼花文件类型,比通过serde读取纯文本性能更好 创建指向文本数据的登录表
create external table landing (c1 string, c2 string, c3 string, c4 string, c5 string, c6 string, c7 string) row format delimited fields terminated by '|' location '/user/hdfs/landing';
创建目标表
create external table destination(c1 string,c2 string,c3 string,c4 string,c5 string,c6 string ,c7 string,c8 string) stored as orc location '/user/hdfs/destination';
100 15 N-PS-GL-PSJOB 1,A JFGLFX48 "AAAA" 102
100 15 N-PS-GL-PSJOB 2,A JFGLFX48 "AAEE" 102
100 15 N-PS-GL-PSJOB 1,A JFGLFX48 "AXXX" 102
100 15 N-PS-GL-PSJOB 2,A JFGLFX48 "ABCH" 102
向目的地插入数据,从着陆点选择记录
insert into destination select c1, c2, c3, split(c4,',')[0] , split(c4,',')[1] ,c5, regexp_replace(c6,'\"','') , c7 from landing;
如果第4列应该是集合,那么可以重用集合逻辑
如果您只想在第一个表上创建一个视图,也可以,但是视图仍然要在文本数据上执行,这比ORC/拼花格式要慢
结果
create external table destination(c1 string,c2 string,c3 string,c4 string,c5 string,c6 string ,c7 string,c8 string) stored as orc location '/user/hdfs/destination';
100 15 N-PS-GL-PSJOB 1,A JFGLFX48 "AAAA" 102
100 15 N-PS-GL-PSJOB 2,A JFGLFX48 "AAEE" 102
100 15 N-PS-GL-PSJOB 1,A JFGLFX48 "AXXX" 102
100 15 N-PS-GL-PSJOB 2,A JFGLFX48 "ABCH" 102
从着陆点选择*
create external table destination(c1 string,c2 string,c3 string,c4 string,c5 string,c6 string ,c7 string,c8 string) stored as orc location '/user/hdfs/destination';
100 15 N-PS-GL-PSJOB 1,A JFGLFX48 "AAAA" 102
100 15 N-PS-GL-PSJOB 2,A JFGLFX48 "AAEE" 102
100 15 N-PS-GL-PSJOB 1,A JFGLFX48 "AXXX" 102
100 15 N-PS-GL-PSJOB 2,A JFGLFX48 "ABCH" 102
从目的地选择*
100 15 N-PS-GL-PSJOB 1 A JFGLFX48 AAAA 102
100 15 N-PS-GL-PSJOB 2 A JFGLFX48 AAEE 102
100 15 N-PS-GL-PSJOB 1 A JFGLFX48 AXXX 102
100 15 N-PS-GL-PSJOB 2 A JFGLFX48 ABCH 102
其他选择包括:-
select c1, c2, c3, split(c4,',')[0] , split(c4,',')[1] ,c5, regexp_replace(c6,'\"','') , c7 from t1;
或者,如果要隐藏查询中替换和拆分的复杂性,只需使用相同的查询创建一个视图即可
create view landingview as select c1, c2, c3, split(c4,',')[0] , split(c4,',')[1] ,c5, regexp_replace(c6,'\"','') , c7 from landing;
这两种方法都会产生相同的结果
100 15 N-PS-GL-PSJOB 1 A JFGLFX48 AAAA 102
100 15 N-PS-GL-PSJOB 2 A JFGLFX48 AAEE 102
100 15 N-PS-GL-PSJOB 1 A JFGLFX48 AXXX 102
100 15 N-PS-GL-PSJOB 2 A JFGLFX48 ABCH 102
谢谢Ak。这很好用。但我还有一个问题。很少的值只有一个字,所以在拆分第二列时,空值会得到空值。请查看以下详细信息:输入数据:hiveva您需要使用case语句来解决此问题