区别在于sc.map是将RDD下的所有行数据统计处理。而sc.mapPartitions是按RDD分区进行数据统计处理。
测试一下:
val data = sc.parallelize(1 to 6,3)
def mapTest(param1:Int):Int={println("by map,data:"+param1)param1*2
}def mapPartitionsTest(listParam:Iterator[Int]):Iterator[Int]&#61;{println("by partition:")var res &#61; for(param<-listParam) yield param*2res
}
data.map(mapTest).collect
data.mapPartitions(mapPartitionsTest).collect
map输出的是6行记录&#xff0c;也就是说一行数据一条记录。
mapPartitions输出的是3行记录&#xff0c;也就是说一个分区一次处理。
另外我在spark-shell写自定义方法时发现有个问题&#xff1a;
def mapPartitionsTest(listParam:Iterator[Int]):Iterator[Int]&#61;{println("by partition:")var res &#61; for(param<-listParam) {yield param*2}res
}
如果我这么写yield&#xff0c;会报 illegal start of statement这个错误&#xff0c;和我说声明的不合法。 奇怪&#xff0c;试了办法没有找到原因&#xff0c;最后把大括号去掉就没有问题了