在 Spark DataFrame 中分组时保留其他列
在执行 DataFrame groupby 操作时,经常会遇到只接收分组的问题列和聚合值。如果您需要保留原始 DataFrame 中的其他列,这可能会很不方便。
例如,考虑以下分组:
df.groupBy(df("age")).agg(Map("id" -> "count"))
这将返回一个仅包含“age”的 DataFrame和“计数(id)”列。但是,如果原始 DataFrame 中存在“name”和其他列,您可能希望将它们包含在结果中。
在标准 SQL 中,可以使用以下查询来实现:
select name, age, count(id) from df group by age
要在 Spark 中复制此行为,您可以将聚合结果与原始表连接起来。连接的关键列应与 groupby 列相同。
这是使用 Spark SQL 的示例:
val groupedDf = df.groupBy($"age").agg(count($"id").as("count")) val joinedDf = df.join(groupedDf, Seq("age"), "left")
joinedDf 现在将包含所有原始列以及聚合的“计数”列。
另一种方法是使用任意聚合(例如第一个或最后一个)来包含其他列。例如:
val groupedDf = df.groupBy($"age").agg(first($"name").as("name"), count($"id").as("count"))
这将确保“name”列保留在聚合的 DataFrame 中。
虽然这些方法允许您在分组期间检索其他列,但请务必注意此类查询通常没有明确定义,并且可能在不同系统中表现出不同的行为。
以上是在 Spark DataFrame 中分组时如何保留其他列?的详细内容。更多信息请关注PHP中文网其他相关文章!