1. 多行合并成一行:使用函数collect_list
假如现在数据表table1如下所示:
col1 col2 col3
A B 1
A B 2
A C 3
A C 4
我们想将col1和col2值相同的col3合并成一行,得到如下的数据表,使用函数collect_list
Col1 col2 col3
A B 1,2
A C 3,4
select col1,col2,concat_ws(“,” , collect_list(cast(col3 as string))) from table1 group by col1, col2
我们将col3转换为string,是因为concat_ws函数只接受string或者array<string>的数据类型
还有一个collect_set,跟collect_list的区别是,前者会去重后再合并在一起。后者不会。
2. 一行扩展成多行
2.1 现有表table2如下:
Col1 col2 col3
A B [1,2]
A C [3,4]
我们想要
Col1 col2 col3
A B 1
A B 2
A C 3
A C 4
也就是把col3展开
使用函数explode。由于explode中不能select其他列,比如
select col1, col2, explode(col3) from table2
是不被允许的
只有select explode(col3)是被允许的,为了解除这个限制,我们要将lateral view和explode连起来用
上面需要的实现:
select col1, col2, col3_explode from table2
lateral view explode(col3) t as clo3_explode
2.2 多列相同位置的一行展开成多行
现有表table3如下所示:
Col1 col2 col3 col4
A B [1,2] [a,b]
A C [3,4] [c,d]
我们想要
Col1 col2 col3 col4
A B 1 a
A B 2 b
A C 3 c
A C 4 d
使用函数posexplode
具体语法如下:
select col1, col2, col3_explode, col4_explode
from table3
lateral view posexplode(col3) t as col3_index, col3_explode
lateral view posexplode(col4) t as col4_index, col4_explode
where col3_index = col4_index
参考链接:
explode和collect_list:
https://my.oschina.net/u/3204727/blog/1571101
posexplode:
https://blog.csdn.net/dzysunshine/article/details/101110467