Sql 配置单元:从嵌套的JSON中提取数据并追加
我有一个包含ID和JSON的配置单元表,如下所示:Sql 配置单元:从嵌套的JSON中提取数据并追加,sql,json,hive,hql,cross-join,Sql,Json,Hive,Hql,Cross Join,我有一个包含ID和JSON的配置单元表,如下所示: id json ---------- 21 | {"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]} 42 | {"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]} id url ---------- 21 | aaa.com 21 | bbb.com 42 | qqq.com 42 | vvv.com 所需的
id json
----------
21 | {"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}
42 | {"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}
id url
----------
21 | aaa.com
21 | bbb.com
42 | qqq.com
42 | vvv.com
所需的输出如下所示:
id json
----------
21 | {"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}
42 | {"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}
id url
----------
21 | aaa.com
21 | bbb.com
42 | qqq.com
42 | vvv.com
有人能帮我做这个蜂巢查询吗
直接应用explode()不起作用,因为json列是一个字符串。您可以使用
get\u json\u object()
和explode()
方法
select id,
get_json_object(jst.js,'$.temp.url') as url
from ( select explode(json) as js FROM json_tab ) jst
您可以同时使用
get\u json\u object()
和explode()
方法
select id,
get_json_object(jst.js,'$.temp.url') as url
from ( select explode(json) as js FROM json_tab ) jst
尝试以下查询:
hive> with cte as (
select stack(2,int(21),string('{"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}'),
int(42),string('{"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}')) as (id,json))
select id,url from (
select id,
split(
regexp_replace(
get_json_object(json,'$.list.url'),
'(\\[|\\]|\")','')
,',')jsn from cte)t
lateral view explode(jsn)asd as url;
输出:
id url
21 aaa.com
21 bbb.com
42 qqq.com
42 vvv.com
功能说明:
id url
21 aaa.com
21 bbb.com
42 qqq.com
42 vvv.com
堆栈
——用于创建样本数据
获取json\u对象
——从json字符串中提取数据
regexp\u replace
--替换[,],“
字符
split
--split on,
将返回数组
分解
--使用数组列分解尝试以下查询:
hive> with cte as (
select stack(2,int(21),string('{"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}'),
int(42),string('{"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}')) as (id,json))
select id,url from (
select id,
split(
regexp_replace(
get_json_object(json,'$.list.url'),
'(\\[|\\]|\")','')
,',')jsn from cte)t
lateral view explode(jsn)asd as url;
输出:
id url
21 aaa.com
21 bbb.com
42 qqq.com
42 vvv.com
功能说明:
id url
21 aaa.com
21 bbb.com
42 qqq.com
42 vvv.com
堆栈
——用于创建样本数据
获取json\u对象
——从json字符串中提取数据
regexp\u replace
--替换[,],“
字符
split
--split on,
将返回数组
分解
——使用数组列分解我意识到json列是一个字符串。我得到一个错误explode()将数组或映射作为参数
。我意识到json列是一个字符串。我得到一个错误explode()将数组或映射作为参数。谢谢,这太棒了!谢谢,这太棒了!