在实际采集场景中,主动采集或被动推送的文件字段可能含有json串,此类多是爬虫数据或是日志数据,hive提供了一类json解析函数在对此类数据通过进行预处理和清洗,此篇介绍get_json_object函数
此时DW中存在一张的DWD表,其中包含了json对象的字段(此表其实仍属于一类业务过程的事实表,只是字段包含了json对象,所以是存放在DWD层,而不是在ODS做处理),这里只截出其中的json字段
是一张房屋信息描述的json
get_json_object(column,"$.param")
其中参数column为需解析的字段,在此例中为result_contxt
第二个参数param需要分情况,若字段内容为json数组则使用 [n].key,表示第几个json对象的key值,若为单个json对象则直接 .key
因上述数据中为单个json对象,故使用第二种方式解析
使用示例:
select
get_json_object(result_contxt, "$.house_type2") as house_type2
from
库名.表名
where
p_day = '20191127'
select
get_json_object(result_contxt,'$.house_type2')as house_type2,
get_json_object(result_contxt,'$.house_type1')as house_type1,
get_json_object(result_contxt,'$.build_type')as build_type,
get_json_object(result_contxt,'$.house_belong')as house_belong,
get_json_object(result_contxt,'$.house_direction')as house_direction,
get_json_object(result_contxt,'$.years_right')as years_right,
get_json_object(result_contxt,'$.title')as title,
get_json_object(result_contxt,'$.last_tran')as last_tran,
get_json_object(result_contxt,'$.unit_price')as unit_price,
get_json_object(result_contxt,'$.belong_area2')as belong_area2,
get_json_object(result_contxt,'$.build_year')as build_year,
get_json_object(result_contxt,'$.tran_time')as tran_time,
get_json_object(result_contxt,'$.lift')as lift,
get_json_object(result_contxt,'$.square_measure2')as square_measure2,
get_json_object(result_contxt,'$.square_measure1')as square_measure1,
get_json_object(result_contxt,'$.poi_id')as poi_id,
get_json_object(result_contxt,'$.total_price')as total_price,
get_json_object(result_contxt,'$.url')as url,
get_json_object(result_contxt,'$.floor')as floor,
get_json_object(result_contxt,'$.decorate')as decorate,
get_json_object(result_contxt,'$.village_name')as village_name,
get_json_object(result_contxt,'$.time')as time,
get_json_object(result_contxt,'$.area_county')as area_county
from
库名.表名
where p_day = '20191127'
查询结果:
其他问题引入:如果字段中为json数组,该如何解析整个json对象呢?
若不清楚的请看笔者的另一篇explode函数的使用介绍。