hive从json-string

时间:2016-05-18 07:18:43

标签: sql arrays json hadoop hive

我有jsons的表:

CREATE TABLE TABLE_JSON (
  json_body string
 );

Json有结构:

{ obj1: { fields ... },  obj2: [array] }

我想从数组中选择所有元素,但我不能。

例如,我可以从第一个对象获取所有字段:

SELECT f.fields...
    FROM (
        SELECT q1.obj1, q1.obj2
        FROM TABLE_JSON jt
        LATERAL VIEW JSON_TUPLE(jt.json_body, 'obj1', 'obj2') q1 AS obj1, obj2
      ) as json_table2
    LATERAL VIEW JSON_TUPLE(TABLE_JSON.obj1, 'fields...') f AS fields...;

但是使用数组这个方法不起作用。

我试图使用

...
    LATERAL VIEW explode(json_table2.obj2) adTable AS arr;

hive explode doc

但是obj2 - 带数组的字符串。如何将string-json转换为数组并将其爆炸?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

您可以考虑使用Hive-JSON SerDe从JSON读取数据。

参考:https://github.com/rcongiu/Hive-JSON-Serde

答案 2 :(得分:0)

这可能不是最佳解决方案,但可以帮助解锁您。对于JSON对象,如下所示

'{"obj1":"field1","obj2":["a1","a2","a3"]}'

此查询可以帮助您将所有数组项目添加到单个列中,因为数组的大小在所有行中都是常量。

    SELECT split(results,",")[0] AS arrayItem1,
       split(results,",")[1] AS arrayItem2,
       regexp_replace(split(results,",")[2], "[\\]|}]", "") AS arrayItem3
    FROM
       (SELECT split(translate(get_json_object(TABLE_JSON.json_body,'$.obj2'), '"\\[|]|\""',''), "},") AS r
       FROM TABLE_JSON) t1 LATERAL VIEW explode(r) rr AS results

它产生的结果看起来像这样

arrayitem1| arrayitem2| arrayitem3
a1        | a2        | a3

您可以在表格大小不变的情况下将其缩放到任意数量的数组大小。