【问题标题】:Convert a column which contains array of string (of unequal size) to exactly two columns with multiple rows in scala spark在scala spark中将包含字符串数组(大小不等)的列转换为具有多行的两列
【发布时间】:2021-10-08 13:56:33
【问题描述】:

我有一个如下所示格式的数据框

+----+---------+
|col1|col2     |
+----+---------+
|100 |[a, b, c]|
|200 |[b, c, d]|
|300 |[d, e]   |
+----+---------+

其中 col1 包含整数,col2 包含字符串数组。我需要将 col2 转换为两列,每列中都有一个字符串,如下所示

要求的格式:

+----+------+------+
|col1|col2_0|col2_1|
+----+------+------+
|100 |a     |b     |
|100 |a     |c     |
|100 |b     |c     |
|200 |b     |c     |
|200 |b     |d     |
|200 |c     |d     |
|300 |d     |e     |
+----+------+------+

即对于 col2 具有大小为 n 的字符串数组的每一行,将有 nC2 行具有两列 col2_0、col2_1 和 col1 相应地填充在行中。

我的尝试: 我只能将 col2 转换为如下所示的多列,但无法以所需的格式进行。

+----+------+------+------+
|col1|col2_0|col2_1|col2_2|
+----+------+------+------+
|100 |a     |b     |c     |
|200 |b     |c     |d     |
|300 |d     |e     |null  |
+----+------+------+------+

如果没有任何结果,我正在考虑循环遍历数据框并将元素添加到所需格式的 Seq,但我认为这不是一个好方法。

我希望问题足够清楚。请让我知道解决此问题的好方法。谢谢!

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    我们可以使用UDF得到所需的结果:

      val spark = SparkSession.builder().master("local[*]").getOrCreate()
      import spark.implicits._
      spark.sparkContext.setLogLevel("ERROR")
    
      // Sample dataframe
      val df = List(
        (100, List("a", "b", "c")),
        (200, List("b", "c", "d")),
        (300, List("d", "e"))).toDF("col1", "col2")
    
      // udf to get required combination
      val getCombinationUDF = udf((row: Seq[String]) => {
        row.combinations(2).toSeq
      })
    
      df.show(false)
      df.withColumn("col2", getCombinationUDF('col2))
        .withColumn("col2", explode_outer('col2))
        .select('col1, 'col2.getItem(0).as("col2_0"), 'col2.getItem(1).as("col2_1"))
        .show(false)
    /*
    +----+------+------+
    |col1|col2_0|col2_1|
    +----+------+------+
    |100 |a     |b     |
    |100 |a     |c     |
    |100 |b     |c     |
    |200 |b     |c     |
    |200 |b     |d     |
    |200 |c     |d     |
    |300 |d     |e     |
    +----+------+------+ */
    

    【讨论】:

    • 这是完美的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2017-11-25
    • 2015-11-16
    • 2023-03-13
    • 1970-01-01
    • 2021-07-23
    • 2017-10-10
    相关资源
    最近更新 更多