本文共 2018 字,大约阅读时间需要 6 分钟。
在关系型数据库中,explode与lateral view的使用本身就是在操作不满足第一范式的数据,这种情况在传统的业务系统或数据仓库中通常被避免。然而随着大数据技术的普及,许多类似PV、UV的数据在业务系统中被存储在非关系型数据库中,使用JSON格式的概率越来越大。这种数据直接导入Hive基础的数仓系统时,通常需要经过ETL过程解析,explode与lateral view在这种场景中就显得尤为重要。
explode主要用于处理map结构的字段。以下是一个使用Hive的示例:
drop table explode_lateral_view;create table explode_lateral_view ( `area` string, `goods_id` string, `sale_info` string)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '|'STORED AS textfile;
a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}] 我们可以使用explode来拆解array字段:
select explode(split(goods_id, ',')) as goods_id from explode_lateral_view;
同样,可以拆解map字段:
select explode(split(area, ',')) as area from explode_lateral_view;
对于更复杂的json数据,可以结合get_json_object进行处理。例如,为了提取monthSales字段:
select get_json_object(explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')),'$.monthSales') as sale_info from explode_lateral_view; 然而,UDTF(用户定义的转换函数)不能直接嵌套使用。如果需要同时处理多个字段,lateral view就成为必要的工具。
lateral view的作用是配合UDTF(如explode)生成多行数据结果集。例如:
select goods_id2,sale_info from explode_lateral_view lateral view explode(split(goods_id, ',')) goods as goods_id2;
这种方式通过笛卡尔积的方式将结果与原表关联,非常适合多字段拆解场景。
对于更复杂的json数据,可以通过以下方式实现全面的数据转换:
select get_json_object(concat('{',sale_info_r,'}'),'$.source') as source, get_json_object(concat('{',sale_info_r,'}'),'$.monthSales') as monthSales, get_json_object(concat('{',sale_info_r,'}'),'$.userCount') as userCount, get_json_object(concat('{',sale_info_r,'}'),'$.score') as score from explode_lateral_view lateral view explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')) sale_info as sale_info_r; 这种方法能够将json格式的数据完整转换为结构化表格,实现数据的可用性提升。
在处理非结构化数据时,explode和lateral view是Hive中非常实用的工具。通过合理搭配这些技术,可以有效地将复杂的json数据转换为结构化表格,提升数据分析的效率。
转载地址:http://bqefk.baihongyu.com/