基于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,数据会被去重,大家使用的时候按照需求使用就好,当然你也可以在内建函数的外层使用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|   爬山|
+----+---+-----+
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值