当前位置: 首页 > 知识库问答 >
问题:

多次spark dataframe groupby

尹俊雅
2023-03-14
val df = (Seq((1, "a", "10"),(1,"b", "12"),(1,"c", "13"),(2, "a", "14"),
              (2,"c", "11"),(1,"b","12" ),(2, "c", "12"),(3,"r", "11")).
          toDF("col1", "col2", "col3"))

所以我有一个有3列的spark dataframe。

+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   a|  10|
|   1|   b|  12|
|   1|   c|  13|
|   2|   a|  14|
|   2|   c|  11|
|   1|   b|  12|
|   2|   c|  12|
|   3|   r|  11|
+----+----+----+

我怎么能做到这一点,有人能解释一下吗?

spark:1.6.2Scala:2.10

共有1个答案

令狐建修
2023-03-14

一种选择是分别做这两个和,然后将它们合并回来:

(df.groupBy("col1", "col2").agg(sum($"col3").as("sum_level2")).
    join(df.groupBy("col1").agg(sum($"col3").as("sum_level1")), Seq("col1")).show)

+----+----+----------+----------+
|col1|col2|sum_level2|sum_level1|
+----+----+----------+----------+
|   2|   c|      23.0|      37.0|
|   2|   a|      14.0|      37.0|
|   1|   c|      13.0|      47.0|
|   1|   b|      24.0|      47.0|
|   3|   r|      11.0|      11.0|
|   1|   a|      10.0|      47.0|
+----+----+----------+----------+

另一个选择是使用窗口函数,考虑到level1_sum是由col1分组的level2_sum的总和:

import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy($"col1")

(df.groupBy("col1", "col2").agg(sum($"col3").as("sum_level2")).
    withColumn("sum_level1", sum($"sum_level2").over(w)).show)

+----+----+----------+----------+
|col1|col2|sum_level2|sum_level1|
+----+----+----------+----------+
|   1|   c|      13.0|      47.0|
|   1|   b|      24.0|      47.0|
|   1|   a|      10.0|      47.0|
|   3|   r|      11.0|      11.0|
|   2|   c|      23.0|      37.0|
|   2|   a|      14.0|      37.0|
+----+----+----------+----------+
 类似资料:
  • 问题内容: 我有这个字符串: 正在做: 似乎只删除了上面字符串中的第一个匹配项。 如何替换 所有 出现的内容? 问题答案: 注意:请勿在对性能有要求的代码中使用此代码。 作为简单文字字符串的正则表达式的替代方法,您可以使用 一般模式是 在某些情况下,它过去比使用和正则表达式要快,但是在现代浏览器中,情况似乎不再如此。 结论:如果您有性能至关重要的用例(例如,处理数百个字符串),请使用Regexp方

  • 问题内容: 我想这是一个普遍的问题,如果不能在正确的位置发布,抱歉。 比如说,我有一个import的函数。如果我要多次从另一个文件调用此函数,我是否假设导入也将多次进行?有没有办法仅在模块不存在时才导入? 基本上,我有一个类,它调用从各个文件导入的多个函数,而不是导入整个文件,我认为仅导入该函数会更容易,但是现在我想知道从长远来看是否会令自己头痛进口过多。 问题答案: 正如描述的蟒蛇文档中,当蟒蛇

  • 对同一变量多次赋值在C++里是合法的,这一点之前并没有多说。第二次赋值的效果是用新值替换掉旧值。 int fred = 5; cout << fred; fred = 7; cout << fred; 这段代码输出57,因为第一次打印fred时,其值是5;第二次打印时其值为7。 这种多次赋值的机制正是我把变量形容为值的容器的原因。在为变量赋值时,修改的是容器里的内容,如图所示: 当存在对同一变量

  • 问题内容: 如何在一行中多次打印一个字符?这意味着我不能使用循环。 我正在尝试多次打印。 我尝试了这种方法,但是不起作用: 是变量。 问题答案: 您可以在同一行中进行打印,因此 可以 使用循环。而不是不添加换行符。 将打印:。

  • 我的主要活动是装载不同的碎片。此外,可以从MainActivity打开设置-activity。 如果用户只是在片段之间切换,那就万事大吉了。 当打开设置-activity并返回MainActivity时,onResume和onPause会被调用两次。如果用户打开设置-activity并再次返回MainActivity,onResume和onPause将被调用三次。每次用户打开“设置-activit