Hive collect、explode函数详解(包括concat、Lateral View)

转自https://blog.****.net/Abysscarry/article/details/81505953

背景: 
最近需要对业务系统数据进行ETL,供机器学习训练,我们需要对数据进行关联聚合,多行或多列数据转换为单行单列这种操作很常见;正好hive提供collect函数可以实现这种格式需求,我们在这整理下用法,顺便扩展一下~

一、collect_set 和 collect_list 函数

collect_set / collect_list(col)函数只接受基本数据类型,它的主要作用是将某字段的值汇总,产生Array类型字段,注意该函数只能接受一列参数!我们一般都会配合group by 函数,直接汇总分组数据!

collect函数也可以实现一个功能:获取group by后面没有的字段!

collect_set 和 collect_list 函数的区别很直观,set会进行去重,而list不会!

测试数据: 

Hive collect、explode函数详解(包括concat、Lateral View)

select month,day,collect_set(cookieid) from test2 group by month,day

Hive collect、explode函数详解(包括concat、Lateral View)

可以看到,结果字段为数组类型! 
我们可以通过下标去获取数组中的数据:

select month,day,collect_set(cookieid)[0] c0 from test2 group by month,day

Hive collect、explode函数详解(包括concat、Lateral View)

select month,day,collect_set(cookieid)[1] c1 from test2 group by month,day

Hive collect、explode函数详解(包括concat、Lateral View)

从上面结果可以看到,取值时如果下标超出范围,会返回NULL

collect_list 函数 除了不去重之外,其他特性和set一模一样:

select month,day,collect_list(cookieid) cl from test2 group by month,day

Hive collect、explode函数详解(包括concat、Lateral View)

select month,day,collect_list(cookieid)[0] cl0 from test2 group by month,day

Hive collect、explode函数详解(包括concat、Lateral View)

二、扩展:concat / concat_ws 函数

如果想按指定格式合并分组内全部行记录怎么处理?

而hive的collect函数只能接受一个参数,无法像mysql的group_concat函数一样能直接多列随意合并,所以我们必须通过hive的concat函数先指定格式合并再collect!
select concat('a','b') c from test2

。。。。。。