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

时间:2016-10-03 11:29:15

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

假设我有以下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|
+----+-----+----------------+

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

有关实现此目标的最佳方法的任何建议?有没有比使用DataFrame更有效的方法?

提前致谢!

1 个答案:

答案 0 :(得分: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"))
    

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