Spark处理Python对象列表的问题

时间:2015-07-06 21:28:02

标签: python list object apache-spark

我正在学习Spark,当我使用Spark处理Python对象列表时,我遇到了一个问题。以下是我的代码:

import numpy as np    
from pyspark import SparkConf, SparkContext

### Definition of Class A
class A:
    def __init__(self, n):
        self.num = n

### Function "display"
def display(s):
    print s.num
    return s

def main():
    ### Initialize the Spark
    conf = SparkConf().setAppName("ruofan").setMaster("local")
    sc = SparkContext(conf = conf)

    ### Create a list of instances of Class A
    data = []
    for i in np.arange(5):
        x = A(i)
        data.append(x)

    ### Use Spark to parallelize the list of instances
    lines = sc.parallelize(data)

    ### Spark mapping
    lineLengths1 = lines.map(display)

if __name__ == "__main__":
    main()

当我运行我的代码时,似乎没有打印每个实例的编号(但它应该打印0,1,2,3,4)。我试图找出原因,但我对此没有任何想法。如果有人帮助我,我真的很感激。

1 个答案:

答案 0 :(得分:1)

首先,永远不会执行display。 RDD被延迟评估,因此只要您不执行an action(例如collectcountsaveAsTextFile),就不会发生任何事情。

问题的另一部分需要了解Spark架构。简化一些事情驱动程序负责SparkContext创建并向工作节点发送任务。在转换期间发生的所有事情(在您的情况下为map)都在Workers上执行,因此print语句的输出将转到Worker stdout。如果你想获得某种输出,你应该考虑使用日志。

最后,如果您的目标是获得某种副作用,那么使用foreach代替地图将是惯用的。