【问题标题】:hive explode list from json-string来自 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转为数组并爆炸?

【问题讨论】:

  • 数组的大小跨行是固定的吗?

标签: sql arrays json hadoop hive


【解决方案1】:
【解决方案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
    

    您可以将其缩放到任意数量的数组大小,条件是整个表格的大小是恒定的。

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 2015-07-08
      • 2021-10-20
      • 1970-01-01
      • 2023-03-06
      • 2022-01-06
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多