在 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 '(?<=\\),(?=\\)'
仅在 和 之间匹配逗号,不包括大括号
(?<=\\)
是一个零宽度的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 (get_json_object) 查询结构数组?