在 Hive 中,这种模式如何从 json 数组中识别嵌套的 json?

Posted

技术标签:

【中文标题】在 Hive 中,这种模式如何从 json 数组中识别嵌套的 json?【英文标题】:In Hive, how does this pattern recognize nested json from json arrays? 【发布时间】:2021-03-15 13:13:09 【问题描述】:

我正在阅读这个问题:Parse JSON Array and load into hive table。

嵌套的json包含多个,但是正则表达式模式(?<=\\),(?=\\)可以识别json元素。谁能解释一下这个拆分功能是如何工作的?

select 
split(substr('["a":"c":"sss","w":123,"b":2,"r":"c":"sss","w":555]',2),'(?<=\\),(?=\\)')[0],
split(substr('["a":"c":"sss","w":123,"b":2,"r":"c":"sss","w":555]',2),'(?<=\\),(?=\\)')[1],
split(substr('["a":"c":"sss","w":123,"b":2,"r":"c":"sss","w":555]',2),'(?<=\\),(?=\\)')[2]

结果是:

"a":"c":"sss","w":123   "b":2    "r":"c":"sss","w":555]

顺便说一句,没有[ 的数组被发送到json_tuple,如"a":1,"b":2]。这根本不是一个 json 数组,为什么 json_tuple 可以使用它?

【问题讨论】:

【参考方案1】:

REGEXP '(?&lt;=\\),(?=\\)' 仅在 和 之间匹配逗号,不包括大括号

(?&lt;=\\) 是一个零宽度的lookbehind,断言紧接在字符串中当前位置之前的是

(?=\\) 是一个零宽度的正向前瞻断言,意味着它应该是 在当前位置之后

因此,split 函数使用 之间的逗号将字符串拆分为数组,不包括括号。这会产生这些元素的数组:

元素 0 是 "a":"c":"sss","w":123 元素 1 是 "b":2 元素 2 是"r":"c":"sss","w":555]

在提到的答案中,explode 应用于数组,它产生带有数组元素的行。

json_tuple 接收元素(数组已经分解),而不是数组。是的,它在最后一个元素中是额外的],最好也将其删除,json_tuple 将元素识别为结构,而不是数组,因为没有[

【讨论】:

以上是关于在 Hive 中,这种模式如何从 json 数组中识别嵌套的 json?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中从这种类型的json数组中获取价值?

Hive解析Json数组超全讲解

Hive解析Json数组超全讲解

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

如何使用 hive 查询查找 hive json 数组字段的长度

如何在 HIVE 中合并具有不同模式的表?