SparkSql API的rollup,cube函数

在学习使用sparkSQL的分组并表函数中,网上大部分人都是直接使用SQL语句使用grouping sets,rollup,cube等函数的,很少有写用api形式如何使用这些函数的,于是我来记录一下api形式的用法。

首先创建spark对象后准备模拟这样一份数据:

import spark.implicits._
import org.apache.spark.sql.functions._

    val data = Seq(
      ("Q1", "January", 1, 100.0),
      ("Q1", "January", 2, 150.0),
      ("Q1", "February", 1, 200.0),
      ("Q2", "April", 15, 300.0),
      ("Q2", "April", 16, 250.0),
      ("Q2", "May", 1, 180.0)
    )
    val df = data.toDF("tran_quarter", "tran_month", "tran_day", "price")
    df.createOrReplaceTempView("transactions")

回忆一下分组并表三个函数的用法:

  • grouping sets 定制分组

    • 如 grouping sets(a,b,c,(a,c))

  • rollup 右滚动排列组合

    • 如 rollup(a,b,c) <=> grouping sets(a,(a,b),(a,b,c))

  • cube 全量排列组合

    • 如 cube(a,b,c) <=> grouping sets(,a,b,c,(a,b),(a,c),(b,c),(a,b,c))

然后是使用,需要注意的是,在api形式中,想要获得grouping__id,并不是和hive一样select这个字段名,而是要写在agg中,调用grouping_id()方法获得。

spark.table("transactions")
      .rollup("tran_quarter","tran_month","tran_day")
      .agg(sum($"price").as("sum"),
        count($"price").as("count"),
        grouping_id().as("id")
      )
      .show()
//cube同理

但是很遗憾的是,api形式里似乎没有grouping sets方法,只有rollup和cube,在官方文档里也没有找到这个api,这样就大大失去了分组的灵活性。所以必要的时候还是只能用SQL形式去写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值