我正在学习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)。我试图找出原因,但我对此没有任何想法。如果有人帮助我,我真的很感激。
答案 0 :(得分:1)
首先,永远不会执行display
。 RDD被延迟评估,因此只要您不执行an action(例如collect
,count
或saveAsTextFile
),就不会发生任何事情。
问题的另一部分需要了解Spark架构。简化一些事情驱动程序负责SparkContext
创建并向工作节点发送任务。在转换期间发生的所有事情(在您的情况下为map
)都在Workers上执行,因此print语句的输出将转到Worker stdout。如果你想获得某种输出,你应该考虑使用日志。
最后,如果您的目标是获得某种副作用,那么使用foreach
代替地图将是惯用的。