开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:有类型转换_去重】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12073
有类型转换_去重
经常在编写一些这个代码的时候,或者大家自己在进行数据处理的时候,有没有发现在很多需求下都需要对结果集来进行去重,去重怎么去使用?
自己实现去重的话还是会有一点点难度的,就是包括使用 map filter 和 flat map,其实都不容易做到,还是比较难的。那去重怎么办?
这个 Spark 已经为我们提供了一个去重的 API,叫做 distinict。并且在我们 scala 当中,也有一个去重的 API。也叫 distinict,但是这个 Spark 当中,还为这个去重提供了一个别名叫做 dropDuplicates。drop 就是去除的意思,Duplicates 就是重复的意思,两个 API 我们一起去了解一下。
接下来进入到 idea 当中,创建一个新的方法,这个方法就命名为叫 def dropDuplicates。
def dropDuplicates(): Unit = {
val ds= spark.creatDataset( Seq(Person(“zhangsan”,15),
Person(“zhangsan”,15),Person(“list”,15)).toDS()
//里面存放三个 person 对象,通过 creatDataset 进行创建
ds .distinict( ).show()
ds .dropDuplicates(coli =”age”).show()
//第一种去重方式。
直接使用 distinct,使用这种 distinct,就能直接去除所有的列当中的重复。可以来看啊,这个 zhangsan 和这个 list 不算是重复列,也不算是重复行,假如说想去掉这个 age 上的重复,该怎么做呢?让我们等会儿再来了解。
这个时候呢,先去 show 一下,那么我们先去查看一下这个 distinct 的这样的一个 API 返回的结果,结果肯定是认为 zhangsan 和 list 不是同一个重复行,如果只想针对于这个 age 来进行去重,也就是说只要 age 相同,就认为是重复。
其实这种需求也经常会见到,那就需要更换一个 API,叫做 ds .dropDuplicates,然后接下来,这个里面需要去传上对应的要去重 age 的那个列,这个时候就去重成功了,但是这个地方传的列名,就不能只使用这个单引号来去进行上传了,需要去传一个字符串。
接下来运行:
看一看第二个结果集,结果也能发现,在这个 dropDuplicates 传入 age 以后,就只出现了一个 zhangsan15,因为这个 zhangsan15 是第一条。并且是按照 age 这一列来进行去重的,这就是去重的两种方式。