开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:无类型转换_groupBy】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12077
无类型转换_groupBy
两个类型的分子,一个叫做剪除,一个叫做聚合。
为什么聚合称之为叫做无类型?
剪除就是一个 drop
val ds= ( Seq(Person(“zhangsan”,12),
Person(“zhangsan”,8),Person(“list”,15)).toDS()
ds.drop(‘age).show()
//当中有两列,一列是 name,一列是 age,可以通过 drop 把 age 剪除掉,drop 就是剪除掉一列。
在这个 SQL 语句当中肯定也写过 drop table,其实就是丢弃的意思,叫做剪除,剪除某个列。然后还有一个叫做 groupBy,前面在有类型的转换操作当中也提到了一个 groupBy,叫做 groupByKey,这个地方就直接叫 groupBy,groupByKey 是一个有类型的,groupBy 是一个无类型的。
进入到 idea 当中就创建一个新的方法,命名为叫做 groupBy。
def groupBy(): Unit = {
val ds= ( Seq(Person(“zhangsan”,12),
Person(“zhangsan”,8),Person(“list”,15)).toDS()
ds.drop(‘age).show()
//首先思考为什么 groupByKey 是一个有类型的
ds.groupByKey(item =>_item.name).agg
//groupByKey 返回 key value group 的这样的一个对象,这个对象必须先执行一个聚合,比如说可以加入 agg,就是聚合的意思,还可以是 Cogroup,flat map groups,reduce,还有 map values。这些算子,也就是说 groupByKey 生成的那个对象,它里面的这些算子是有类型的。
这是最主要的原因。比如说 mapValues()(ds.groupByKey(item =>_item.name).mapValues)是一个有类型的,最主要的原因 groupByKey 所生成的对象的算子是有类型的。
//其次是思考为什么 groupBy 是一个无类型的
import org.apache,spark.sql.functions._
ds.groupBy(‘cols =’name).agg(mean(columnName =”name”)).show()
groupBy 在一开始就跟 groupByKey 是不一样的,比如说我们 group by 可以直接按照某一列来进行 group(‘cols =’name),这就比直接这个地方(item =>_item.name)返回一个函数要舒服。这里面的方法,avg 、max、mean、pivot、sum 与类型没关系,按照哪一列进行 max,也就是 SQL 语句当中那个 select max.....,Select mean.....,然后 agg 是聚合,也是按照 column 来聚合。
所以 groupBy 是一个无类型的主要是因为 groupBy 所生成的那个对象是无,类型里面的算子是无类型。这个时候就知道如何使用 groupBy 与 groupByKey。根据个人喜好进行选择,最好是选择 groupBy,但有的时候,确实有极个别的场景 groupBy 做不到,只能用 groupByKey,但确实不是那么常见。因为 SQL 使用这么久,没有理由必须得用有类型的 API。
接下来导入 import org.apache,spark.sql.functions._,就可以对其求一个 mean,mean 按照 age 列来进行求,就是一种统计的方式,统计完了以后,就进行 show,agg 是 groupBy 所生成的 Relation GroupedDataset 的这样的一个类型的算子,这是一个必须要求先聚合的一个算子,groupByKey 生成的是一个叫做 keyValueGroup 的一个类型的对象,跟这个地方 Relation GroupedDataset 有一点区别。
运行一下
按理说所生成的结果应该是按照年龄的,求一个均数。
结果进行分析,首先是 groupBy 按照 name 进行分组,对每一组的数据求一个均数,应该分为两组,第一组是两个 zhangsan,第二组是一个 lisi,求出来的均数是 zhangsan10 岁和 lisi15 岁。这就是结果。
以上就是无类型转换_groupBy 的内容。