先说结论:
–待操作语句
[{"website":"www.baidu.cn","name":"tomjerry"},{"website":"cloud.baidu.com","name":"carbondata 中文文档"}]
–完整hql表达式
select json_tuple(baidu.json, 'website', 'name') from (SELECT explode(split(regexp_replace(regexp_replace('[{"website":"www.baidu.cn","name":"tomjerry"},{"website":"cloud.baidu.com","name":"carbondata 中文文档"}]', '\\}\\,\\{','\\}\\;\\{'),'\\[|\\]',''),'\\;')) as json) as baidu;
再来进行sql语法分析:
-- 子查询a
regexp_replace('[{"website":"www.baidu.cn","name":"tomjerry"},{"website":"cloud.baidu.com","name":"carbondata 中文文档"}]', '\\}\\,\\{','\\}\\;\\{')
正则表达式,将两个json之间的’},{‘替换为’};{’,以便于后面通过’;'切割为两个json
-- 子查询b
regexp_replace(子查询a,'\\[|\\]','')
正则表达式,将数组的’[|]‘替换为没有符号,以便于后面通过’;'切割为两个json时没有多余符号
-- 子查询c
split(子查询b,'\\;')
通过’;'将字符串切割为两个json
-- 子查询d
explode(子查询c) as json
通过explode()将split()分割后的json数组炸开,实现行转列输出,列名定义为json
-- 子查询e
select 子查询d
查询函数处理后的表,并保存为临时表
-- 子查询f
json_tuple(json, 'website', 'name')
json_tuple(表名.json字段名,'json字段的key1','json字段的key2'...)
将 子查询e 产生的json类型的字段通过json_tuple()函数得到对应的value值
select 子查询f from 子查询e as 别名;
总查询语句
————————————————
版权声明:本文为博主的原创文章,转载请附上原文出处链接。