如何在pyspark中使用mapPartitions

时间:2017-03-23 15:54:24

标签: python apache-spark pyspark rdd itertools

在遵循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)

1 个答案:

答案 0 :(得分:1)

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

当分区只有一个项目时(除了一个项目以外都应该是这种情况),你实际上会丢弃整个分区。

一些注意事项:

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