Hive 将 JSON 数组中的每个 JSON 元素分解为行

Posted

技术标签:

【中文标题】Hive 将 JSON 数组中的每个 JSON 元素分解为行【英文标题】:Hive explode each JSON element in JSON array to rows 【发布时间】: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 返回的,它看起来像字符串......或者你有更好的主意吗?顺便说一句,我刚刚修改了原来的问题帖子。 【参考方案1】:

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

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

【讨论】:

以上是关于Hive 将 JSON 数组中的每个 JSON 元素分解为行的主要内容,如果未能解决你的问题,请参考以下文章

如何从 json 数组中获取 hive 中的字符串列表

将json数组导入hive

Hive解析Json数组超全讲解

Hive解析Json数组超全讲解

如何使用 Hive (get_json_object) 查询结构数组?

如何将存储在列中的 JSON 数组中的每个元素的行拆分为一行?