SQL的concat()、concat_ws()、collect_set、行转列、列转行的操作

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() 和concat_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 的用处。

猜你喜欢

转载自blog.csdn.net/weixin_41928342/article/details/84960931