根据多列将一行分成多行[重复]
Posted
技术标签:
【中文标题】根据多列将一行分成多行[重复]【英文标题】:Break a row into multiple rows based on multiple columns [duplicate] 【发布时间】:2018-06-07 19:10:49 【问题描述】:我在 spark 中有一个数据框:
id | itemid | itemquant | itemprice
-------------------------------------------------
A | 1,2,3 | 2,2,1 | 30,19,10
B | 3,5 | 5,8 | 18,40
这里所有的列都是字符串数据类型。
如何跨多个列使用explode函数并创建如下所示的新数据框:
id | itemid | itemquant | itemprice
-------------------------------------------------
A | 1 | 2 | 30
A | 2 | 2 | 19
A | 3 | 1 | 10
B | 3 | 5 | 18
B | 5 | 8 | 40
在新的数据框中,所有的列也是字符串数据类型。
【问题讨论】:
【参考方案1】:你需要一个 UDF:
val df = Seq(
("A","1,2,3","2,2,1","30,19,10"),
("B","3,5","5,8","18,40")
).toDF("id","itemid","itemquant","itemprice")
val splitAndZip = udf((col1:String,col2:String,col3:String) =>
col1.split(',').zip(col2.split(',')).zip(col3.split(',')).mapcase ((a,b),c) => (a,b,c)
)
df
.withColumn("tmp",explode(splitAndZip($"itemId",$"itemquant",$"itemprice")))
.select(
$"id",
$"tmp._1".as("itemid"),
$"tmp._2".as("itemquant"),
$"tmp._3".as("itemprice")
)
.show()
+---+------+---------+---------+
| id|itemid|itemquant|itemprice|
+---+------+---------+---------+
| A| 1| 2| 30|
| A| 2| 2| 19|
| A| 3| 1| 10|
| B| 3| 5| 18|
| B| 5| 8| 40|
+---+------+---------+---------+
【讨论】:
以上是关于根据多列将一行分成多行[重复]的主要内容,如果未能解决你的问题,请参考以下文章