1、首先学习一下cancat()函数:
cancat()函数:用于连接两个或多个数组
案例:
源数据:
user | order_type | order_number |
zhangsan | collect | 20 |
wangwu | payment | 3 |
zahngsan | payment | 5 |
wangwu | collect | 15 |
目标:
user | order_gross |
zhangsan | collect(20),payment(5) |
wangwu | collect(15),payment(3) |
我们需要使用concat()函数将order_type和order_number连接起来。
首先知道 :concat(order_type,'(',order_number,')') 是将两个字段拼接起来,拼接之后的结果是:
user | order |
zhangsan | collect(20) |
wangwu | payment(3) |
zahngsan | payment(5) |
wangwu | collect(15) |
然后我们使用concat_ws() 和collect_set() 进行合并行的操作:说白了是一个列转行。
select user,concat_ws(',' , collect_set ( concat ( order_type , '(' , order_number , ')' ) ) ) order from table group bu user
其中order是别名 第一个逗号是以逗号分隔!
collect_set的作用:
(1):去重,对group by后面的user进行去重
(2):对group by以后 属于同一user的形成一个集合,结合concat_ws对集合中元素使用,进行分割形成字符串
==============================================列转行=========================================
HIVE的行转列列的操作:
在hive中如何进行行转列呢? 使用 :concat_ws(‘分割时使用的字符’collect_set(字段))
test.txt
a b 1
a b 2
a b 3
c d 4
c d 5
c d 6
如何将上图转化成为:
a b 1,2,3
c d 4,5,6
语句 :
select col1,col2,concat_ws( ' , ' , collect_set ( col3 ) ) from tablename group by col1 , col2;
上述就是一个行转列! 使用到了concat_ws()这个函数!
其中里面的collect_set 的作用:它只接受基本数据类型,主要作用是将某字段的值进行去重汇总,产生array类型字段。
如何将上面的在转化回去呢??这就用到了列转行 :lateral view explode() HIVE的列转行函数。
语句: ;
select col1 , col2 ,col5 from tablename lateral view explode( split ( col3 , ' , ' ) ) b as col5 ;
其中b是一个虚表的名称,这个字段是必须要有的!。
其中explode 的作用的是列转行:这个函数接受array类型的参数,其作用恰好与collect_set相反,实现将array类型数据行转列:
上面就是一个concat concat_ws collect_set 的用处。