来自 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 不匹配

熊猫如何为每个新行爆炸几个列表项

Pyspark - 基于列表中的值爆炸数据框

用于在 json 中爆炸的值列表的 Hive 查询

宇宙大爆炸!宇宙的时间序列表!

如何减去蜂巢中的项目