Spark SQL汇总具有相同键的行并附加总和值

问题描述 投票:0回答:1

假设我有以下DataFrame。

+----+-----+
|lang|count|
+----+-----+
|  en|    4|
|  en|    5|
|  de|    2|
|  en|    2|
|  nl|    4|
|  nl|    5|
+----+-----+

如何将每种唯一语言的“count”值相加,并将此值附加为新列(因此,不减少行数)?

在我的例子中,这将导致:

+----+-----+----------------+
|lang|count|totalCountInLang|
+----+-----+----------------+
|  en|    4|              11|
|  en|    5|              11|
|  de|    2|               2|
|  en|    2|              11|
|  nl|    4|               9|
|  nl|    5|               9|
+----+-----+----------------+

DataFrames是通过map上的DStream操作构建的。

关于什么是实现这一目标的最佳方法的任何建议?有没有比使用DataFrame更有效的方法?

提前致谢!

scala apache-spark dataframe apache-spark-sql
1个回答
4
投票

您可以使用以下之一:

  • 窗口上的总和: import org.apache.spark.sql.expressions.Window val df = Seq( ("en", 4), ("en", 5), ("de", 2), ("en", 2), ("nl", 4), ("nl", 5) ).toDF("lang", "count") val w = Window.partitionBy("lang").rowsBetween( Window.unboundedPreceding, Window.unboundedFollowing ) df.withColumn("totalCountInLang", sum("count").over(w))
  • 聚合和加入: df.join(df.groupBy("lang").sum(), Seq("lang"))

对于小组,前一种解决方案应该表现得稍好一些。对于较大的,通常提供后者,可选地与广播功能相结合。

© www.soinside.com 2019 - 2024. All rights reserved.