https://blog.csdn.net/yeweiouyang/article/details/46352845
业务背景
hive表test_user_browse记录了用户浏览过的商品,该表的数据如下:
username product
John product_a,product_b,product_c,product_d
Tom product_e,product_f
现在,想要将product字段拆分为多行。
实现方式
现在借助lateral view 和explode()来完成。
select
username,
browse_product
from pms.test_user_browse
lateral view explode(split(product, ',')) myTable as browse_product;
执行结果如下:
username browse_product
John product_a
John product_b
John product_c
John product_d
Tom product_e
Tom product_f
lateral view的介绍可以参见lateral view
lateral view为侧视图,意义是为了配合UDTF来使用,把某一行数据拆分成多行数据.不加lateral view的UDTF只能提取单个字段拆分,并不能塞会原来数据表中.加上lateral view就可以将拆分的单个字段数据与原始表数据关联上.
在使用lateral view的时候需要指定视图别名和生成的新列别名
例如
select id,num from table lateral view explode(array1) subview as num;
subview为视图别名,num为指定新列别名
lateral view explode 相当于一个拆分array1字段的虚表,然后根据id将其与原表进行笛卡尔积关联.
我们也可以多次使用lateral view explode
select id,num1,num2 from table
lateral view explode(array1) subview1 as num1
lateral view explode(array2) subview2 as num2
where ...;
我们可以理解为lateral view为table的一个cross join,关联键是table的id