MySQL里面有一个强大的group_concat函数,可以把group by的结果聚集到同一行中,

比如下面这样的表:

uid iid
1 101
1 102
1 103
2
104
3
105

select uid, group_concat(iid) from xxx group by uid


执行之后结果类似于:

1 101,102,103
2 104
3 105


但是HiveQL里面却没有这样的东东,那有没有办法可以实现类似的功能呢?

答案是肯定的,那就是collect_set函数,这个是Hive内置的UDAF函数,

可以将多行记录聚集到一个array里面,用法跟group_concat差不多,唯一不同的是,collect_set会将重复记录剔除(集合的基本特性),并且由于它返回的是一个array对象,所以必须使用相关的函数来操作里面的数据,如size(),可以得到这个array的大小;或者array_contains(),判断某个数据是否在集合中,等等。具体请参考hive官方手册。