使用Scala和Spark将重复的值合并到Dataframe的字段中

时间:2019-12-12 16:08:58

标签: scala dataframe apache-spark

我有一个类似以下的DF:

ID  hier    
1   Z1  
1   Z2      
2   Z1
2   Z2

和所需的输出是DF,类似于下一个:

ID  hier    
1   Z1,Z2   
2   Z1,Z2       

我知道Fold和reduce的用法,但我不清楚如何在这种情况下使用它。

1 个答案:

答案 0 :(得分:1)

FoldReduce是功能方法。使用DataFrames提供了一个关系代数来表达您的变换。您应该考虑对问题使用collect_list内置函数:

    import org.apache.spark.sql.functions._
    import spark.implicits._

    val df = Seq(
      (1,"Z1"),
      (1,"Z2"),
      (2,"Z1"),
      (2,"Z2")
    ).toDF("ID", "hier")

    df.groupBy($"ID").agg(collect_list($"hier").as("hier"))
      .show(false)

+---+------------------+
|ID |hier              |
+---+------------------+
|2  |[Z1, Z2]          |
|1  |[Z1, Z2]          |
+---+------------------+

如果您想要一个字符串,则可以改用此转换:

df.groupBy($"ID").agg(concat_ws(",",collect_list($"hier")).as("hier"))

+---+-----+
|ID |hier |
+---+-----+
|2  |Z1,Z2|
|1  |Z1,Z2|
+---+-----+