spark sql中collect_list的逆操作 将一行转化为多行 explode函数

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

首先创建简单DF

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

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()

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|
+----+--------+-----+-------+

完美逆操作!!!!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值