比较来自世界各地的卖家的域名和 IT 服务价格

spark dataframe groupby 反复

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


所以,我有一个 spark dataframe 从 3 发言者。


+----+----+----+
|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|
+----+----+----+


我的要求实际上是我需要执行两个级别的东西 groupby, 如下所述。

等级 1:
如果我做 groupby 在 col1 我做了一笔钱 Col3. 我得到两列。
1. 在 col1
2. 和/col3/
我失去了这里 col2.

第2举行:
如果我想再次组成 col1 和 col2 并赚取金额 Col3, 我会越来越低 3 列。
1. 在 col1
2. 柱子 col2
3. 和/col3/

我的要求实际上是我需要执行两个级别的东西 groupBy 并有这两列/sum/col3/ of level1, sum/col3/ of level2/ 无限的 dataframe.

我该怎么做,有人可以解释一下吗?

spark : 1.6.2
Scala : 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是金额 level2_sum, 分组
col1

:


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|
+----+----+----------+----------+

要回复问题请先登录注册