本文参考
在阅读了《Spark快速大数据分析》动物书后,大概了解到了spark常用的api,不过书中并没有给予所有api详细的案例,而且现在spark的最新版本已经上升到了2.4.5,动物书中的spark版本还停留在1.2.0版本,所以就有了这篇文章,在最新的2.4.5版本下测试常用的api
由于spark的惰性计算特性,RDD只有在第一次行动操作中被用到时才会真正进行计算,因此我打算将文章内容分为"转化操作API"和"行动操作API"两部分,同时因为pair RDD(RDD中的元素是键值对)的部分api较为特殊,所以我打算单独再写一篇文章
本文仅介绍转化操作API,前5个api是针对一个RDD的转化操作,后续的api是针对两个RDD的转化操作
环境
idea + spark 2.4.5 + scala 2.11.12
map()函数
目的:
将函数应用于RDD中的每个元素,将返回值构成新的RDD
代码:
val testList = List(1, 2, 3, 3)
val testRdd = sc.parallelize(testList)
testRdd.map(ele => ele * ele).foreach(ele => print(s"$ele "))
输出:
1 4 9 9
更高效的操作:
每个RDD被分为多个分区,这些分区在集群的不同节点上运行,可以使用mapPartitions()函数,将转化操作作用于每个分区的元素上,这种方法还可以为每个分区创建一个JDBC连接,而不是为每一个元素创建一个连接(此处不做示例)
mapPartitions()函数有两个参数,第一个参数接收一个函数,和map()函数相同,第二个参数为preservesPartitioning,默认值为false,仅当我们对pair RDD进行转化操作,并且没有修改键时设置为true
val testList = List(1, 2, 3, 3)val testRdd = sc.parallelize(testList)testRdd.mapPartitions(partition => partition.map( ele => { ele * ele })).foreach(ele => print(s"$ele "))
flatMap()函数
目的:
将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD,我们也常常说成是"压扁"
"压扁"这个词可能听上去不大好理解,我们提供给flatMap()的函数分别应用到RDD的那个元素上,不过返回的不是一个元素,而是一个返回值序列的迭代器,但输出的RDD不是由迭代器组成,得到的是一个包含各个迭代器可以访问的所有元素的RDD
代码:
val testList = List(1, 2, 3, 3)val testRdd = sc.parallelize(testList)testRdd.flatMap(ele => { ele.to(5)}).foreach(ele => print(s"$ele "))
来源:https://www.cnblogs.com/kuluo/p/12545374.html