来自 json-string 的蜂巢爆炸列表
Posted
技术标签:
【中文标题】来自 json-string 的蜂巢爆炸列表【英文标题】:hive explode list from json-string 【发布时间】:2016-05-18 07:18:42 【问题描述】:我有带 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转为数组并爆炸?
【问题讨论】:
数组的大小跨行是固定的吗? 【参考方案1】:来自 Brickhouse (http://github.com/klout/brickhouse) 的 json_split UDF 可以将 JSON 数组转换为 Hive 列表,然后您可以将其分解。
见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/
【讨论】:
【参考方案2】:您可以考虑使用 Hive-JSON SerDe 从 JSON 中读取数据。
参考:https://github.com/rcongiu/Hive-JSON-Serde
【讨论】:
【参考方案3】:这可能不是最佳解决方案,但可以帮助您解除屏蔽。对于如下所示的 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
您可以将其缩放到任意数量的数组大小,条件是整个表格的大小是恒定的。
【讨论】:
以上是关于来自 json-string 的蜂巢爆炸列表的主要内容,如果未能解决你的问题,请参考以下文章
来自 typescript/javascript 的 JSON.stringify 与 Java 控制器中的 json-String param/request-body 不匹配