Spark DataFrame 按键将列值聚合到 List 中

Posted

技术标签:

【中文标题】Spark DataFrame 按键将列值聚合到 List 中【英文标题】:Spark DataFrame aggregate column values by key into List 【发布时间】:2016-05-25 14:37:05 【问题描述】:

我有一个DataFrame,看起来像这样:

+-----------------+-------+
|Id               | value |
+-----------------+-------+
|             1622| 139685|
|             1622| 182118|
|             1622| 127955|
|             3837|3224815|
|             1622| 727761|
|             1622| 155875|
|             3837|1504923|
|             1622| 139684|
+-----------------+-------+

我想把它变成:

    +-----------------+-------------------------------------------+
    |Id               | value                                     |
    +-----------------+-------------------------------------------+
    |             1622|139685,182118,127955,727761,155875,139684  |
    |             3837|3224815,1504923                            |
    +-----------------+-------------------------------------------+

这可能仅使用DataFrame 函数还是我需要将其转换为RDD

【问题讨论】:

【参考方案1】:

可以使用DataFrame API。试试:

df.groupBy(col("Id"))
  .agg(collect_list(col("value")) as "value")

如果您想要一个由, 分隔的String 而不是Array,那么试试这个:

df.groupBy(col("Id"))
  .agg(collect_list(col("value")) as "value")
  .withColumn("value", concat_ws(",", col("value")))

【讨论】:

谢谢大卫,太棒了! 你要导入什么(在独立应用中)【参考方案2】:

如David Griffin above 所示,您可以使用Scala/Java DataFrame API 中的collect_list 函数。

不过,也可以使用相同的函数,但使用 Spark SQL API:

spark.sql("SELECT id, collect_list(value) FROM df GROUP BY id")

【讨论】:

以上是关于Spark DataFrame 按键将列值聚合到 List 中的主要内容,如果未能解决你的问题,请参考以下文章

Spark将列拆分为数组和聚合计算

spark将列值作为sql查询执行

将列值转换为行值

将列值转换为日期时间以插入 AccessDB

如何将列除以 Spark DataFrame 中的总和

使用 Scala 将列分配给 Spark Dataframe 中的另一列