【问题标题】:Hive explode each JSON element in JSON array to rowsHive 将 JSON 数组中的每个 JSON 元素分解为行
【发布时间】:2020-06-22 10:19:03
【问题描述】:

我已经收集了 JSON 数据,例如:

{"body":{"metrics":[{"a":1,"a1":1.1,"properties":{"propA":"name","propB":"age"}},{"b":2}]}}
{"body":{"metrics":[{"c":3}]}}

我可以使用select get_json_object(get_json_object(columnA,'$.Body'),'$.metrics') from... 来提取嵌套的 json 数组,例如:

[{"a":1,"a1":1.1,"a2":{"propA":"name","propB":"age"}},{"b":2}]
[{"c":3}]

我想将它们转换成如下行:

{"a":1,"a1":1.1,"a2":{"propA":"name","propB":"age"}}
{"b":2}
{"c":3}

get_json_object 返回的数组似乎是字符串,当我使用later view 时,它总是说: UDFArgumentException explode() takes an array or a map as a parameter

每个数组的长度是不确定的,我无权将 jar 文件上传到活动的新 udf 或 serde 类。如何实现这一点...

【问题讨论】:

  • 你是说这是 STRING: [{"a":1},{"b":2}] 吗?
  • @leftjoin 感谢您的回复。我不确定......它是由get_json_object 返回的,它看起来像字符串......或者你有更好的主意吗?顺便说一句,我刚刚修改了原来的问题帖子。

标签: json hive hiveql


【解决方案1】:

假设您的 json 在表 test 中。您可以使用以下查询来获得所需的输出:

select m.* from test s
LATERAL view explode(split(regexp_replace(get_json_object(value,'$.body.metrics'),'^\\[|]$',''), ',(?!")')) m

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 2015-04-12
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多