Spark中RDD的map/foreach/mapPartition/foreachPartition操作
在Spark中对RDD进行循环操作是一种非常常见的操作,正常情况下循环包含两种方法,一种是map()操作,一种是foreach()操作。这两者都是对RDD数据进行循环,但是前者属于transformation操作,后者是action操作。我们知道,在Spark中,所有的 transformations 都是懒加载的,不会马上计算它们的结果,而是仅仅记录转换操作是应用到哪些基础数据集上的,只有当 actions 要返回结果的时候计算才会发生。因此,RDD的map操作不会立即生效。RDD的transformation操作会产生一组新的RDD数据,但是action是在原有数据上进行操作,并不返回新数据。因此,通常foreach是操作一些不需要返回值的方法,或者返回值为空的方法,如向外部系统中传递数据等。而map操作则可以返回一个新的RDD,因此适合你需要对数据进行处理并计算得到新的结果。
我们以几个例子来说明:
//首先我们创建一个向量
val a = sc.parallelize(0 to 10)
//用map方式循环a,对其中每个元素+1
val b = a.map(_+1)
//用foreach方式循环a,对其中每个元素+1
val c = a.foreach(_+1)
//用foreach方式循环打印b
b.foreach(println)
//用foreach方式循环打印c
c.foreach(println)
//用map方式循环打印b
b.map(println)
//用map方式循环打印c
c.map(println)
执行上述语句,我们应该会依次得到如下结果:
