【问题标题】:how to convert string into complex array of struct and explode in hive如何将字符串转换为复杂的结构数组并在蜂巢中爆炸
【发布时间】:2020-04-16 23:35:50
【问题描述】:

我有下面的蜂巢表

id     string 
code   string
config string  

价值观:

dummyID|codeA|[{"pmc":"111","scc":"aa1","pgtp":"a22","pgn":"a33","pgrc":"a44"},{"pmc":"222","scc":"bb1","pgtp":"b22","pgn":"b33","pgrc":"b44","sen":"b77"},{"pmc":"333","scc":"cc1","pgtp":"c22","pgn":"c33","pgrc":"c44","pscc":[],"mapb":"c88"},{"pmc":"444","scc":"dd1","pgtp":"d22","pgn":"d33","pgrc":"d44","pscc":["ghgh"],"mapb":"d88"},{"pmc":"555","scc":"ee1","pgtp":"e22","pgn":"e33","pgrc":"e44","mapb":"e88"}]

我需要像下面的输出那样分解数组:(结构下的任何元素都可以是可选的)

dummyID|codeA|{"pmc":"111","scc":"aa1","pgtp":"a22","pgn":"a33","pgrc":"a44"}
dummyID|codeA|{"pmc":"222","scc":"bb1","pgtp":"b22","pgn":"b33","pgrc":"b44","sen":"b77"}
dummyID|codeA|{"pmc":"333","scc":"cc1","pgtp":"c22","pgn":"c33","pgrc":"c44","pscc":[{"qtgm":"tt1","swrt":"rr2"}],"mapb":"c88"}
dummyID|codeA|{"pmc":"444","scc":"dd1","pgtp":"d22","pgn":"d33","pgrc":"d44","pscc":["ghgh"],"mapb":"d88"}
dummyID|codeA|{"pmc":"555","scc":"ee1","pgtp":"e22","pgn":"e33","pgrc":"e44","mapb":"e88"}

我试过了:

select 
id,
code,
exp_val   
FROM   temp 
LATERAL VIEW explode(array(config)) temp AS exp_val ;

上面的查询没有给出任何错误,但没有爆炸并得到单行, 横向视图内联也不起作用

我尝试使用以下架构创建表,并尝试从上面的字符串配置字段插入记录,但由于数据类型不匹配错误而失败

id    string,
code  string,
config  array<struct<pmc:String,scc:String,pgtp:string,pgn:string,pgrc:string,pscc:Array<String>,sen:Array<String>,mapb:Array<String>>> 

当我尝试为配置运行选择查询时,我得到了以下结果

|dummyID|codeA|{"pmc":"[{\"pmc\":\"111\",\"scc\":\"aa1\",\"pgtp\":\"a22\",\"pgn\":\"a33\",\"pgrc\":\"a44\"},{\"pmc\":\"222\",\"scc\":\"bb1\",\"pgtp\":\"b22\",\"pgn\":\"b33\",\"pgrc\":\"b44\",\"sen\":\"b77\"},{\"pmc\":\"333\",\"scc\":\"cc1\",\"pgtp\":\"c22\",\"pgn\":\"c33\",\"pgrc\":\"c44\",\"pscc\":[],\"mapb\":\"c88\"},{\"pmc\":\"444\",\"scc\":\"dd1\",\"pgtp\":\"d22\",\"pgn\":\"d33\",\"pgrc\":\"d44\",\"pscc\":[\"ghgh\"],\"mapb\":\"d88\"},{\"pmc\":\"555\",\"scc\":\"ee1\",\"pgtp\":\"e22\",\"pgn\":\"e33\",\"pgrc\":\"e44\",\"mapb\":\"e88\"}]","scc":null,"pgtp":null,"pgn":null,"pgrc":null,"pscc":null,"sen":null,"mapb":null} 

Explode 也不适用于此数据集

我有什么遗漏吗?

【问题讨论】:

    标签: arrays hadoop struct hive explode


    【解决方案1】:

    在explode函数中删除array并尝试以下操作

    select 
     id,
     code,
     exp_val   
    FROM temp 
    LATERAL VIEW explode(config) temp AS exp_val ;
    

    第二个选项:

    select 
     t.id,
     t.code,
     e.*   
    FROM temp t
    LATERAL VIEW outer inline(t.config) e ;
    

    【讨论】:

    • config 在第一种情况下被定义为字符串,所以我应用了数组但是我尝试删除它没有将数组分解成多行
    • @ashwini 添加了第二个选项,试试看告诉我。
    • 谢谢我也试过了,这里的问题是配置在源代码中定义为字符串,它无法将其转换为结构数组
    【解决方案2】:

    你可以试试这个方法,

    首先 SPLIT 将字符串转换为字符串类型的数组。

    第二个Explode数组。

    举个例子

    WITH table AS(
    select 'dummyID' AS id,'codeA' AS code, SPLIT('[{"pmc":"111","scc":"aa1","pgtp":"a22","pgn":"a33","pgrc":"a44"},{"pmc":"222","scc":"bb1","pgtp":"b22","pgn":"b33","pgrc":"b44","sen":"b77"},{"pmc":"333","scc":"cc1","pgtp":"c22","pgn":"c33","pgrc":"c44","pscc":[],"mapb":"c88"},{"pmc":"444","scc":"dd1","pgtp":"d22","pgn":"d33","pgrc":"d44","pscc":["ghgh"],"mapb":"d88"},{"pmc":"555","scc":"ee1","pgtp":"e22","pgn":"e33","pgrc":"e44","mapb":"e88"}]','\\{') AS array)
    SELECT id,code, exp_val
    FROM   table
    LATERAL VIEW explode(array) table AS exp_val;
    

    输出

    +----------+--------+----------------------------------------------------+--+
    |    id    |  code  |                      exp_val                       |
    +----------+--------+----------------------------------------------------+--+
    | dummyID  | codeA  | [                                                  |
    | dummyID  | codeA  | "pmc":"111","scc":"aa1","pgtp":"a22","pgn":"a33","pgrc":"a44"}, |
    | dummyID  | codeA  | "pmc":"222","scc":"bb1","pgtp":"b22","pgn":"b33","pgrc":"b44","sen":"b77"}, |
    | dummyID  | codeA  | "pmc":"333","scc":"cc1","pgtp":"c22","pgn":"c33","pgrc":"c44","pscc":[],"mapb":"c88"}, |
    | dummyID  | codeA  | "pmc":"444","scc":"dd1","pgtp":"d22","pgn":"d33","pgrc":"d44","pscc":["ghgh"],"mapb":"d88"}, |
    | dummyID  | codeA  | "pmc":"555","scc":"ee1","pgtp":"e22","pgn":"e33","pgrc":"e44","mapb":"e88"}] |
    +----------+--------+----------------------------------------------------+--+
    

    【讨论】:

    • 谢谢,我希望整个结构作为一行,所以尝试使用 } 拆分,但 strcut 中的任何字段都可以包含其他嵌套结构,这将导致拆分无法与 bcz 一起使用的场景,它可以有另一行{} 在外部 {}
    • 我将查询更改为其他模式,您可以使用 substr、replace 和 concat 来调整阶段表中的 exp_val。
    • 谢谢..我尝试了它的工作,除了我在 pscc 中嵌套结构的场景..更新了源数据..!!
    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2014-06-10
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多