将具有重复元素的JSON文件加载到配置单元表中

时间:2018-07-02 14:47:17

标签: json hive

给出这个简单的JSON文件:

{
    "EVT": {
        "EVT_ID": "12345",
        "LINES": {
            "LINE": {
                "LINE_NUM" : 1,
                "AMT" : 100,
                "EVT_DT" : "2018-01-01"
            },
            "LINE": {
                "LINE_NUM" : 2,
                "AMT" : 150,
                "EVT_DT" : "2018-01-02"
            }
        }
    }
}

我们需要将其加载到配置单元表中。最终目标是将json展平,如下所示:

+--------+----------+-----+------------+
| EVT_ID | Line_Num | Amt |   Evt_Dt   |
+--------+----------+-----+------------+
|  12345 |        1 | 100 | 2018-01-01 |
|  12345 |        2 | 150 | 2018-01-02 |
+--------+----------+-----+------------+

这是我当前表的DDL:

create table foo.bar (
    `EVT` struct<
        `EVT_ID`:string,
        `LINES`:struct<
            LINE: struct<`LINE_NUM`: int,`AMT`:int,`EVT_DT`:string>
        >
    >)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';

第二个“行”似乎正在覆盖第一个。从表中简单选择*即可返回;

{"evt_id":"12345","lines":{"line":{"line_num":2,"amt":150,"evt_dt":"2018-01-02"}}}

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

JSON和表定义错误。 “重复元素”是一个数组。 LINES应该为update my_update_table m inner join ( select id, group_concat(concat(date,'-' , carrier,'-', tracking)) my_col from my_table group by id ) t on m.id = t.id set m.shipping_info = t.my_col ,而不是array<struct>(请注意方括号):

struct<struct>

您也不需要此{ "EVT": { "EVT_ID": "12345", "LINES": [ { "LINE_NUM" : 1, "AMT" : 100, "EVT_DT" : "2018-01-01" }, { "LINE_NUM" : 2, "AMT" : 150, "EVT_DT" : "2018-01-02" } ] } } ,因为它只是一个数组元素