我是靠谱客的博主 生动手链,这篇文章主要介绍spark sql中collect_list的逆操作 将一行转化为多行 explode函数,现在分享给大家,希望可以做个参考。

大家都知道collect_listcollect_set是将多行同组数据转化为一行,但是如何进行其的逆操作将一行数据转化为同组的多行数据呢?

首先创建简单DF

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var x = Seq( ("li", "1,2,3"), ("bo", "10,20,30") ).toDF("name", "time") x.show() 初始表为: +----+--------+ |name| time| +----+--------+ | li| 1,2,3| | bo|10,20,30| +----+--------+

我们为了后期和其他表进行合并,给初始表添加一个index
参考自:https://blog.csdn.net/xiligey1/article/details/82498389

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.apache.spark.sql.expressions.Window import org.apache.spark.sql.functions.row_number val w = Window.orderBy("name") val result = x.withColumn("index", row_number().over(w)) result.show() 结果是: +----+--------+-----+ |name| time|index| +----+--------+-----+ | bo|10,20,30| 1| | li| 1,2,3| 2| +----+--------+-----+

name是我初始表中的列名,可以自己替换

将time值进行展开:

参考:https://blog.csdn.net/baifanwudi/article/details/86700400
//备注:explode已经弃用了,现在使用functions.expolde()。
//备注:split() 在scala中形式是 string.split("-", Int i) 所以也需要使用functions.split()
//备注:col需要使用functions.col()

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import org.apache.spark.sql.functions val finalResult= result.withColumn("newtime",functions.explode(functions.split(functions.col("time"),","))) finalResult.show() 结果是: +----+--------+-----+-------+ |name| time|index|newtime| +----+--------+-----+-------+ | bo|10,20,30| 1| 10| | bo|10,20,30| 1| 20| | bo|10,20,30| 1| 30| | li| 1,2,3| 2| 1| | li| 1,2,3| 2| 2| | li| 1,2,3| 2| 3| +----+--------+-----+-------+

完美逆操作!!!!

最后

以上就是生动手链最近收集整理的关于spark sql中collect_list的逆操作 将一行转化为多行 explode函数的全部内容,更多相关spark内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部