开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:聚合操作_多维聚合_rollup】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12090
聚合操作_多维聚合_rollup
Rollup
Rollup 是用来做多维聚合的,并且可以使多维聚合变得非常简单。
rollup 操作符其实就是 groupBy 的一个扩展,比如 rollup(“city”,“year”)会生成两个执行计划,这个执行计划如何执行:第一步,按照 city,year 进行 groupBy;然后进行 city groupBy;最后进行全局的 groupBy。
如果传入两个参数,groupBy 三次;如果传入三次,groupBy 四次。
这是因为 rollup 会对传入的列进行滚动 groupBy , groupBy 的次数为列数量+1,最后—次是对整个数据集进行聚合。
创建数据集:
import org.apache.spark.sql.functions._
val sales = Seq(
( "Beijing",2016,100) ,
( "Beijing" ,2017,200) ,
( "Shanghai" ,2015,50) ,
( "Shanghai" ,2016,150) ,
( "Guangzhou" ,2017,50)
).toDF( "city" , "year" ,"amount" )
创建方法并将数据集 copy 进 AggProcessor.scala
@Test
def rollup(): unit = {
import org.apache.spark.sql.functions._
val sales=Seq(
("Beijirfg", 2016,100),
("Beijing",2017,200) ,
( "shanghai",2015,50),
("shanghai",2o16,150),
( "Guangzhou",2017,50)
).toDF(colNames = "city","year","amount")
注:amount 指这个城市一年的销售额
}
需求 1:统计每个城市每年的销售额
需求 2:每个城市义工的销售额
需求 3:总体销售额
要求:在结果集中出现如下类型数据:
beijing 2016 100
shanghai 2017 150
null null 250
如果忽略年份,查看 beijing 所有年份的销售额,数据类型如下:beijing null 100
如何实现上述需求及要求:
). toDF( colNames = "city", "year", "amount" )
sales. rollup( cols = 'city, 'year)
. agg( sum( " amount) as" amount" )
. sort('city.asc_ nulls_ last, 'year .asc_ nulls_ last)
注:升序排列,将空值放在后面
.show()
}
运行并查看结果集
从结果集中可以看出:
先按 city 进行了一次排序,当年份为空时按照城市进行统计;当 city 和 year 都为空时,是总销售额。
Beijing 2016 100——按照 city,year 统计结果,代表 beijing 某一年的销售额
Beijing null 300——按照 city 统计结果 beijing 总共销售额
Null null 550——全局聚合,整个公司所有年份销售额
Rollup 就是滚动分组,滚动分组:假如传入 a、b 两列,会产生三个分组结果,第一个是 a 的分组结果,第二个是 b 的分组结果,最后是 null 的分组结果。注意 rollup 只是一个分组,最终还是要对分组结果进行聚合。