加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 多次火花数据帧组

发布时间:2020-12-16 19:17:45 所属栏目:安全 来源:网络整理
导读:val df = (Seq((1,"a","10"),(1,"b","12"),"c","13"),(2,"14"),"11"),"12" ),(3,"r","11")). toDF("col1","col2","col3")) 所以我有一个包含3列的火花数据帧. 我的要求实际上是我需要执行两个级别的groupby,如下所述. 1级: 如果我在col1上进行groupby并做一
val df = (Seq((1,"a","10"),(1,"b","12"),"c","13"),(2,"14"),"11"),"12" ),(3,"r","11")).
          toDF("col1","col2","col3"))

所以我有一个包含3列的火花数据帧.

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

1级:
如果我在col1上进行groupby并做一个Col3的总和.我将在两列以下.
col1
总和(col3)
我会在这里松开col2.

级别2:
如果我想再次按col1和col2分组并做一个Col3的总和,我将得到3列以下.
col1
2. col2
总和(col3)

我的要求实际上是我需要执行两个级别的groupBy并且在最后一个数据帧中具有这两个列(level1的sum(col3),level2的sum(col3)).

我怎么能这样做,任何人都可以解释一下吗?

火花:1.6.2
斯卡拉: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|
+----+----+----------+----------+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读