根据多列将一行分成多行[重复]

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

【讨论】:

以上是关于根据多列将一行分成多行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将一行“if else”语句分成多行[重复]

将多列合并为单列[重复]

将数据从多行转换为多列[重复]

怎么将excel中两列转换成多行多列

根据某些条件添加两行或多行[重复]

Oracle一列的多行数据拼成一行显示