在遵循Apache Spark文档之后,我尝试使用mapPartition模块进行实验。在下面的代码中,我希望在函数myfunc
中看到初始RDD。我只是在打印值后返回迭代器。但是当我在RDD上collect
时,它是空的。
from pyspark import SparkConf
from pyspark import SparkContext
def myfunc(it):
print(it.next())
return it
def fun1(sc):
n = 5
rdd = sc.parallelize([x for x in range(n+1)], n)
print(rdd.mapPartitions(myfunc).collect())
if __name__ == "__main__":
conf = SparkConf().setMaster("local[*]")
conf = conf.setAppName("TEST2")
sc = SparkContext(conf = conf)
fun1(sc)
答案 0 :(得分:1)
mapPartitions
与此无关。迭代器(此处itertools.chain
)是有状态的,只能遍历一次。当你打电话给it.next()
时,你会阅读并丢弃第一个元素,你返回的是序列的尾部。
当分区只有一个项目时(除了一个项目以外都应该是这种情况),你实际上会丢弃整个分区。
一些注意事项:
next
的方式不可移植,不能在Python 3中使用。