在学习使用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形式去写。