开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:RDD 算子_转换_排序】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11977
RDD 算子_转换_排序
内容介绍
一、前言
二、实例
三、总结
一、前言
在学习完前面的课程后,我们来了解一下在 RDD 中的排序问题。与排序相关的算子有两个,一个叫做 sortBy ,一个叫做 sortByKey 。 sortBy 是可以作用于 keyValue 和普通类型的数据, sortByKey 则必须作用于 keyValue 的数据类型。
二、实例
先看一个小案例,理解一下 sortBy 和 sortByKey 的实现过程。创建一个方法 sort ,定义两个集合,第一个集合为基本型数据,第二个集合为 keyValue 型数据。
sortBy 是让算子明白应该使用哪部分数据进行排序。
代码如下:
@Test
def sort() : Unit = {
val rdd1 = sc.parallelize(Seq(2,4,1,5,1,8))
val rdd2 = sc.parallelize(Seq(("a",1),("b",3),("c",2)))
rdd1.sortBy(item => item)
rdd2.sortBy(item => item._2).collect().foreach(println(_))
rdd2.sortByKey()
}
运行后的结果为( a ,1),( c ,2),( b ,3)。将代码结尾稍稍改动后,再次运行观察结果,改动如下:
rdd2.sortByKey().collect().foreach(println(_))
运行后的结果为( a ,1),( b ,3),( c ,2),可以注意到它是按照 ABC 字典序列进行排序的。
如果想用 Value 进行排序,同时也想使用 sortByKey ,可使用以下代码,只是稍稍有点麻烦:
rdd2.map(item =>(item._2, item._1)).sortByKey().map(item => (item._2, item._1))
运行该代码后,可得到( a ,1),( c ,2),( b ,3),这是按照 Value 进行排序的。
个人认为 sortBy 的实用价值会更高一些,sortByKey 是一种简写,按照 Key 来进行排序。
三、总结
简单总结一下, sortBy 作用于任何类型数据的 RDD ,可以按照任何部分进行排序。
sortByKey 只适用于 keyValue 类型的数据,只能按照 Key 排序,但是 sortByKey 写法简单,无需编写函数。这就是 sortBy 和 sortByKey 的区别。