【问题标题】:Spark SQL sum rows with the same key and appending the sum valueSpark SQL 对具有相同键的行求和并附加总和值
【发布时间】:2019-02-19 19:24:05
【问题描述】:

假设我有以下 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 是通过对DStreammap 操作构建的。

对于实现这一目标的最佳方法有什么建议吗?有没有比使用 DataFrames 更有效的方法?

提前致谢!

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    您可以使用以下方法之一:

    • 对窗口求和:

      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"))
      

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

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2018-08-18
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多