新建hive表
create external table asmp.json_test(
id string,
info string
)
row format delimited fields terminated by '\t' lines terminated by '\n'
location 'hdfs://nameservice1/user/asmp/json_test'
插入数据
1 [{"name":"Tom","city":"Beijing"},{"name":"Jack", "city":"Shanghai"},{"name":"Bill", "city":"Tianjin"}]
2 [{"name":"David", "city":"Beijing"},{"name":"Jack", "city":"Shanghai"},{"name":"Bill", "city":"Tianjin"}]
处理数据1:
SELECT t.id,get_json_object(concat('{',names,'}'),'$.name') as passengername
FROM asmp.json_test t
LATERAL VIEW explode(split(regexp_replace(regexp_replace(t.info,'\\[\\{',''),'}]',''),'},\\{')) names as names
处理数据2:
select a.id,count(a.passengername) nums from
(
SELECT t.id,get_json_object(concat('{',names,'}'),'$.name') as passengername
FROM asmp.json_test t
LATERAL VIEW explode(split(regexp_replace(regexp_replace(t.info,'\\[\\{',''),'}]',''),'},\\{')) names as names
) a
group by a.id
使用到的函数:
#regexp_replace(string initial_string, string pattern, string replacement) 根据正则表达式处理文本格式
第一个参数为字段,第二个参数为要替换的文本格式,第三个参数为替换后的目标格式,第二第三个参数均使用正则表达。
#split(string str, string pat) 将字符串分割
第一个参数为操作的字符串,第二个参数为分割符。
#lateral view explode()
行转列,将一个字段内的内容拆成多行
CONCAT()
将多个字符串合并为一个
#get_jason_object(column, "$.parameter") 解析json数据
第一个参数是选择的字段,第二个参数是json数据中选择的参数