(3)针对分区的计算函数
接下来讲讲RDD的各种函数操作,正是有了这些函数才使得RDD能完成各自功能
3.1.转换
RDD中有各种转换操作,正是因为有了这些转换操作,我们才能实现各种应用程序,正如之前我们所说RDD实质上就是一个Java类,因此它的各种转换操作其实也就是RDD类中的方法,转换操作其实就是从RDD类生成了其他的类,如MappedRDD,FilteredRDD类等等
3.1.1 map
map函数对RDD中的每一个元素都调用了f函数生成新值,最终新值集合生成了MappedRDD,是一对一的操作
如:
val disData=sc.parallelize(Array(1,2,3,4,5),2)
val d=disData.map(s=>s+2)
结果:d=3,4,5,6,7
map()函数的得到的新的RDD的分区信息和父RDD一致
3.1.2 flatMap
flatMap()函数也是对RDD中的每一个元素都调用了f函数,生成新值,最终新值集合生成了FlatMappedRDD,不同于map()函数的是它是一对多的操作
如:
val disData=sc.parallelize(Array(1,2,3),2)
val d1=disData.map(s=>1to s).collect
val d2=disData.flatMap(s=>1to s).collect
结果:d1会出错,因为map是一对一的操作;d2=Array(1,1,2,1,2,3)
此外,下面这个例子也能说明map和flatMap的不同,不过一般在Spark中不会经常体现出
如:
val xs = Map("a" ->List(11,111), "b" ->List(22,222)
val d1= xs.map(_._2)
val d2= xs.flatMap(_._2)
结果:
d1=List(List(11,111),List(22,222));d2=List(11,111,22,222);
flatMap()函数的得到的新的RDD的分区信息和父RDD一致
未完待续。。。。