Hive中explode和lateral view组合的用法

 

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

Hive中explode和lateral view组合的用法_第1张图片

可以看到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

Hive中explode和lateral view组合的用法_第2张图片

可以看到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')

此时数据张这个样子

Hive中explode和lateral view组合的用法_第3张图片

再执行sql 

SELECT id,tmp_col_id from t1 t LATERAL VIEW explode(split(t.name,',')) tmp_tab as tmp_col_id

再查看计算结果

Hive中explode和lateral view组合的用法_第4张图片

可以看到我们添加了一行和id为1对应的数据完全相同的数据,其id为4

在执行计算时,a这一行可以join到1和4这两行,所以会有如上的表现

 

 

你可能感兴趣的:(Hive)