开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:聚合操作_多维聚合_GroupedDataset】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12094
聚合操作_多维聚合_GroupedDataset
多维聚合
之前的课程中介绍了三个算子,第一个 groupby,第二个 rollup,第三个是 cube。
接下来,我们要了解一个小知识点:,无论是 groupby 还是 rollup、cube,在调用这三个算子时,它们都返回了一个数据类型叫做 relationalGroupedDataset
Relational 是有关系;Grouped,是分过组的;
这三个算子返回的并不是 dataframe,可以理解为是转换算子,但是并不是生成 dataset,而是生成了 relationalGroupedDataset。
这三个算子,它们生成的数据集中有什么内容?怎么创建出的数据集?这个数据集有什么用的?
1.GroupedDataset
常见的 RelationalGroupedDataset 获取方式有三种:
groupBy、rollup、cube
valrgd:RelationalGroupedDataset= df.groupBy/df.rollup/df.cube
大家以往看到的是进行 df.groupby.agg.min.max 这些操作,agg/min/max 是 rgd 的。
RelationalGroupedDataset 是想告诉用户,开发者,通过 group 创建出来的并不是一个 dataframe,是一个分过组的数据集。要对这个数据集来进行排序才行,在比较严格的 sql 模式下,写不出 select source,year from…group by source, year 这样的代码。在正常情况下写这种代码的话是有一点问题的,就是在 circle 语句当中,如果出现 group,前面一定有聚合,要注意这一点。
无论通过任何一种方式获取了 RelationalGroupedDataset 对象,其所表示的都是是一个被分组的 DataFrame ,通过这个对象,可以对数据集的分组结果进行聚合.
val groupedDF: RelationalGroupedDataset = pmDF. groupBy ( ' year)
需要注意的是, RelationalGroupedDataset 并不是 DataFrame ,所以其中并没有 DataFrame 的方法,只有如下一些聚合相关的方法,如下这些方法在调用过后会生成 DataFrame 对象,然后就可以再次使用 DataFrame 的算子进行操作了
操作符 |
解释 |
avg |
求平均数 |
count |
求总数 |
max |
求极大值 |
min |
求极小值 |
Mean |
求均数 |
sum |
求均数求和 |
agg |
聚合,可以使用 sql.functions 中的函数来配合进行操作 pmDF. groupBy ( ' year) .agg(avg( "pm)as "pm_avg") |
注意:
使用 groupby、rollup、cube 这三个算子生成的并不是 dataframe,也不是 dataset,而是一个分过组的数据集。