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
一种选择是分别做这两个和,然后将它们合并回来:
(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