当前位置: 首页 > 知识库问答 >
问题:

基于多列将一行拆分为多行[重复]

龙毅
2023-03-14

我在 spark 中有一个数据帧:

id   |   itemid   |   itemquant   |  itemprice 
-------------------------------------------------
 A   |    1,2,3   |   2,2,1       |  30,19,10
 B   |    3,5     |   5,8         |  18,40

此处,所有列均为字符串数据类型。

如何在多列中使用分解功能,并创建如下所示的新数据框:

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个答案

贾实
2023-03-14

为此您需要一个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(',')).map{case ((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|
+---+------+---------+---------+
 类似资料:
  • 问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue

  • 问题内容: 我的问题是我有一个这样的表: c1 | c2 | c3 | c4是一个由|分隔的值。 我的最终结果应如下所示: 我该怎么做呢? 谢谢 问题答案: 这就是您可以执行的操作,使用管道将字符串拆分并使用spark函数爆炸数据 输出: 希望这可以帮助!

  • 问题内容: 我有桌子: 我想要这样的输出: 问题答案: 如果可以创建一个数字表,其中包含从1到要拆分的最大字段的数字,则可以使用以下解决方案: 请看这里的小提琴。 如果无法创建表,则解决方案可以是: 这里有个小提琴例子。

  • 我有表: 我想要这样的输出:

  • 我目前有一个数据表,其中一列类型为“a b c d e...”。将此列称为“COL4” 我想通过拆分col4的元素来将单行拆分为多行,同时保留所有其他列的值。 COL1[0]COL2[0]COL3[0]a b c 我希望输出为: COL1[0]COL2[0]COL3[0]a COL1[0]COL2[0]COL3[0]a b c 这不是我想要的。

  • 问题内容: 我有一个问题,如果我有一排像这样 我如何将其分成三行,如下所示: / J 问题答案: 您可以使用递归CTE: SQLFiddleDEMO 编辑: 基于Marek Grzenkowicz的回答和MatBailie的评论,全新的想法: 生成从1到max(qty)的数字,并在其上加入表。 SQLFiddle演示