Python 如何在pyspark中使用mapPartitions

Python 如何在pyspark中使用mapPartitions,python,apache-spark,pyspark,rdd,itertools,Python,Apache Spark,Pyspark,Rdd,Itertools,在阅读ApacheSpark文档之后,我尝试使用mapPartition模块进行实验。在下面的代码中,我希望在函数myfunc中看到初始RDD,我只是在打印值后返回迭代器。但是当我在RDD上收集时,它是空的 from pyspark import SparkConf from pyspark import SparkContext def myfunc(it): prin

在阅读ApacheSpark文档之后,我尝试使用mapPartition模块进行实验。在下面的代码中,我希望在函数
myfunc
中看到初始RDD,我只是在打印值后返回迭代器。但是当我在RDD上收集时,它是空的

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)

mapPartitions
与此无关。迭代器(此处
itertools.chain
)是有状态的,只能遍历一次。调用
it.next()
时,读取并丢弃第一个元素,返回的是序列的尾部

当分区只有一个项目时(除一个项目外,其他所有项目都应该如此),您实际上会丢弃整个分区

请注意:

  • 将任何东西放入任务中通常都是无用的
  • 您使用
    next
    的方式是不可移植的,不能在Python 3中使用