行列转换的其实是一个很常用的数据分析操作,用在数据的拼接与拆分上,实现一些普通的函数无法实现的效果
列转行
首先为大家介绍的是列转行函数,涉及到的内建函数有,collect_list 列转行之后不去重,collect_set 列转行之后去重。 列转行是对一列数据进行聚合的操作,且要求这一列的数据类型是 string 使用实例如下原数据如下
2018-01,项目1,100
2018-01,项目2,200
2018-01,项目3,300
2018-01,项目3,400
2018-02,项目1,1000
2018-02,项目2,2000
2018-03,项目x,999
sql如下
spark.sql("select yue, collect_set(project) projects,sum(shouru) zsr from sr group by yue").show()
结果如下
+-------+---------------+----+
| yue| projects| zsr|
+-------+---------------+----+
|2018-03| [项目x]| 999|
|2018-02| [项目1, 项目2]|3000|
|2018-01|[项目1, 项目2, 项目3]| 600|
我使用的是collect_set,数据会被去重,大家使用的时候按照需求使用就好,当然你也可以在内建函数的外层使用concat_ws('分隔符',字段)
完成自定义的拼接结果
行转列
下面介绍一下行转列函数,涉及内建函数explode有必要提醒大家一句,explode和UDTF一进多出函数不一样,虽然两者的结果在使用上都会用lateral view进行使用,但是行转列函数在使用上没有UDTF灵活多变,可以说行转列是比较于UDTF而言的一个初步拆分一条记录中某一个字段数据为一列数据的函数,UDTF是可以灵活的控制输入和输出的,而行转列通常和split同时出现,因为它需要传入一个容器数据
数据如下
A 20 篮球,排球,乒乓球
B 30 跳舞,唱歌
C 23 唱歌,爬山
语句如下
spark.sql("select name,age,t.hobby from sr2 lateral view explode(split(hobby,',')) t as hobby").show()
结果如下,结果会自动纵向匹配
+----+---+-----+
|name|age|hobby|
+----+---+-----+
| A| 20| 篮球|
| A| 20| 排球|
| A| 20| 乒乓球|
| B| 30| 跳舞|
| B| 30| 唱歌|
| C| 23| 唱歌|
| C| 23| 爬山|
+----+---+-----+