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不会!
测试数据:
select month,day,collect_set(cookieid) from test2 group by month,day
可以看到,结果字段为数组类型!
我们可以通过下标去获取数组中的数据:
select month,day,collect_set(cookieid)[0] c0 from test2 group by month,day
select month,day,collect_set(cookieid)[1] c1 from test2 group by month,day
从上面结果可以看到,取值时如果下标超出范围,会返回NULL
collect_list 函数 除了不去重之外,其他特性和set一模一样:
select month,day,collect_list(cookieid) cl from test2 group by month,day
select month,day,collect_list(cookieid)[0] cl0 from test2 group by month,day
二、扩展:concat / concat_ws 函数
如果想按指定格式合并分组内全部行记录怎么处理?
而hive的collect函数只能接受一个参数,无法像mysql的group_concat函数一样能直接多列随意合并,所以我们必须通过hive的concat函数先指定格式合并再collect!
select concat('a','b') c from test2
。。。。。。