1、首先创建一张表
create table t1 (id int,name string)
insert into t1 (id,name) values (1,'a,b,c'),(2,'d,e,f')
执行
SELECT explode(split(t.name,',')) from t1 t
可以看到explode函数的作用是把列转行
如果我们想把id为1的name值a,b,c和1组合时就要用到lateral view函数
SELECT id,colAliasName from t1 t LATERAL VIEW explode(split(t.name,',')) tableAliasName as colAliasName
可以看到id为1对应的name值 a,b,c都和1组合在了一起,
那么我们返回来再看这条sql的语法
SELECT id,colAliasName from t1 t LATERAL VIEW explode(split(t.name,',')) tableAliasName as colAliasName
lateral view UDTF(expression) tableAliasName as colAliasName
其中UDTF(expression)表示表生成函数说白了就是行转列的函数,即一行变为多行的函数,比如explode,当然也可以通过UDF自定义函数把一行转为多行,或者UDF返回Array,再通过explode炸成多行
tableAliasName表示表的别名,colAliasName表示表的列的别名
原理是:通过lateral view UDTF(expression)函数把一行转换为多行,会生成一个临时表,把这些数据放入这个临时表中,然后使用这个临时表和base表做inner join 使用的条件就是原始表的关系
原始表为
即name为'a,b,c'对应1 name为'd,e,f'对应2
在inner join 阶段通过这层关系做join的筛选,即当把name列炸开之后,a为单独的一行,在原表中有 "a->1这层关系",
所以在select列表(id,colAliasName)中,id和colAliasName两个列,a对应的id就是1
当然,要临时表和base表即原表做inner join当然表和列都要有别名。
2、在base表中再添加几条数据
insert into t1 (id,name) values (3,'f,g,h'),(4,'a,b,c')
此时数据张这个样子
再执行sql
SELECT id,tmp_col_id from t1 t LATERAL VIEW explode(split(t.name,',')) tmp_tab as tmp_col_id
再查看计算结果
可以看到我们添加了一行和id为1对应的数据完全相同的数据,其id为4
在执行计算时,a这一行可以join到1和4这两行,所以会有如上的表现