首页 >数据库 >mysql教程 >如何在 Spark DataFrame GroupBy 之后保留非聚合列?

如何在 Spark DataFrame GroupBy 之后保留非聚合列?

Susan Sarandon
Susan Sarandon原创
2024-12-31 14:33:11361浏览

How to Keep Non-Aggregated Columns After a Spark DataFrame GroupBy?

如何在 Spark DataFrame GroupBy 中保留非聚合列

使用 DataFrame 的 groupBy 方法聚合数据时,生成的 DataFrame 仅包含该组-按键和聚合值。但是,在某些情况下,可能还需要在结果中包含原始 DataFrame 中的非聚合列。

Spark SQL 的限制

Spark SQL 如下1999 年之前的 SQL 约定,不允许在聚合查询中添加附加列。像 count 这样的聚合在应用于多个列时会产生未明确定义的结果,因此处理此类查询的不同系统会表现出不同的行为。

解决方案:

要保留非- Spark DataFrame groupBy 中的聚合列,有以下几种选项:

  1. Join Original DataFrame: 将聚合后的 DataFrame 与原始 DataFrame 连接起来以添加缺失的列。
val aggregatedDf = df.groupBy(df("age")).agg(Map("id" -> "count"))
val joinedDf = aggregatedDf.join(df, Seq("age"), "left")
  1. 使用窗口函数: 使用诸如first 或最后在聚合查询中包含其他列。然而,在某些情况下,这种方法的计算成本可能会很高。
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy(df("age"))
val aggregatedDf = df.withColumn("name", first(df("name")).over(windowSpec))
  .groupBy(df("age")).agg(Map("id" -> "count"))

以上是如何在 Spark DataFrame GroupBy 之后保留非聚合列?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn