Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 解析数组<;字符串>;在配置单元中使用OPEN CSV SEREDE_Hive - Fatal编程技术网

Hive 解析数组<;字符串>;在配置单元中使用OPEN CSV SEREDE

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 我需要实施 使用“|”进行分析,并使用“”和“ 删除引号 我

我得到的数据格式如下:

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

我需要实施

  • 使用“|”进行分析,并使用“”和“
  • 删除引号
  • 我使用数组作为第4列和opencsvserede的数据类型来删除引号。但如何在opencsv serede中传递拆分方法(集合项以“,”结尾)

    行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde' 使用SerdeProperty(“分离器CHAR”=“|”,“quoteChar”=“\”)

    谢谢
    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语句来解决此问题