基于SparkSql实现行列转换

行列转换的其实是一个很常用的数据分析操作,用在数据的拼接与拆分上,实现一些普通的函数无法实现的效果

列转行

首先为大家介绍的是列转行函数,涉及到的的内建函数有,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,数据会被去重,大家使用的时候按照需求使用就好

行转列

下面介绍一下行转列函数,涉及内建函数explode

有必要提醒大家一句,explode和UDAF一进多出函数不一样,虽然两者的结果在使用上常常都会用lateral view,但是行转列函数在使用上没有UDAF灵活多变,可以说行转列是比较于UDAF而言的一个初步拆分一条记录中某一个字段数据为一列数据的函数,UDAF是可以灵活的控制输入和输出的,而行转列通常和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|   爬山|
+----+---+-----+

猜你喜欢

转载自blog.csdn.net/dudadudadd/article/details/114373379
今日推荐