我有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;
但是obj2 - 带数组的字符串。如何将string-json转换为数组并将其爆炸?
答案 0 :(得分:2)
来自Brickhouse的json_split UDF(http://github.com/klout/brickhouse)可以将JSON数组转换为Hive List,然后你可以将其爆炸。
请参阅http://mail-archives.apache.org/mod_mbox/hive-user/201406.mbox/%3CCAO78EnLgSrrUY3Ad_ZWS9zWNKLQRwS9jXrqEE869FhUNiWgCXA@mail.gmail.com%3E和https://brickhouseconfessions.wordpress.com/2014/02/07/hive-and-json-made-simple/
答案 1 :(得分:0)
您可以考虑使用Hive-JSON SerDe从JSON读取数据。
答案 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
您可以在表格大小不变的情况下将其缩放到任意数量的数组大小。