对多列数据进行分组聚合
使用 Spark DataFrame 的 groupBy 方法时,可以对特定列进行聚合操作来汇总数据。但是,生成的 DataFrame 将仅包含分组列和聚合结果。
要解决此限制并检索附加列和聚合,请考虑以下解决方案:
使用第一个或最后一个聚合
一种方法是使用first()或last()聚合函数在您的分组数据框。例如:
df.groupBy(df("age")).agg(Map("name" -> "first", "id" -> "count"))
此查询将创建一个包含三列的 DataFrame:“age”、“name”和“count(id)”。 “name”列包含每个年龄组的第一个值,“count(id)”列包含每个年龄组的“id”值的计数。
加入聚合结果
另一种解决方案是使用分组列作为连接键将聚合的 DataFrame 与原始 DataFrame 连接起来。此方法保留原始 DataFrame 中的所有列:
val aggregatedDf = df.groupBy(df("age")).agg(Map("id" -> "count")) val joinedDf = aggregatedDf.join(df, Seq("age"), "left")
生成的 DataFrame“joinedDf”将包含原始 DataFrame 中的所有列,以及分组 DataFrame 中的“count(id)”聚合。
使用窗口函数
最后,您还可以使用窗口函数通过附加列来模拟 groupBy 的所需行为。下面是一个示例:
df.withColumn("rowNum", row_number().over(Window.partitionBy("age"))) .groupBy("age").agg(first("name"), count("id")) .select("age", "name", "count(id)")
此查询创建一个窗口函数,为每个年龄组内的每条记录分配行号。然后,它使用此行号检索每个年龄组中第一次出现的“name”,以及“count(id)”聚合。
方法的选择取决于具体要求和性能考虑因素您的申请。
以上是使用 groupBy 聚合 Spark DataFrame 中的数据时如何保留所有列?的详细内容。更多信息请关注PHP中文网其他相关文章!