我有一个带有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
此配置单元查询会帮助任何人吗?
直接应用explode()无效,因为json列是字符串。
答案 0 :(得分:0)
您可以将get_json_object()
和explode()
方法一起使用
select id,
get_json_object(jst.js,'$.temp.url') as url
from ( select explode(json) as js FROM json_tab ) jst
答案 1 :(得分:0)
尝试以下查询:
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
功能说明:
Stack
-用于创建示例数据
get_json_object
-从json字符串中提取数据
regexp_replace
-替换[,],"
个字符
split
-在,
上分割,它将返回数组
explode
-使用数组列爆炸