PySpark:在循环中打印到终端内部

时间:2017-04-03 17:39:49

标签: python apache-spark pyspark

我自己开始学习Spark,所以我的问题可能真的很傻。

无论如何,我正在研究Spark安装提供的示例(链接:https://github.com/apache/spark/blob/master/examples/src/main/python/kmeans.py

我想稍微修改一下代码,因为我需要更好地理解map-reduce操作。

我想做的是:

while tempDist > convergeDist:
    print('Here \n')
    closest = data.map(
        lambda p: (closestPoint(p, kPoints), (p, 1)))
    print(closest)
    pointStats = closest.reduceByKey(
        lambda p1_c1, p2_c2: (p1_c1[0] + p2_c2[0], p1_c1[1] + p2_c2[1]))
    print(pointStats)
    newPoints = pointStats.map(
        lambda st: (st[0], st[1][0] / st[1][1])).collect()

但是,使用命令

执行脚本时,实际上并未打印上述打印件
 spark-submit kmeans.py

而不是稍后

 print("Final centers: " + str(kPoints))

实际上是打印到终端。

有人可以帮助我理解为什么吗?

1 个答案:

答案 0 :(得分:0)

closestpointStats都是rdds,当你在rdds上打印语句时,你只能在终端上看到像PythonRDD[36] at RDD at PythonRDD.scala:48这样的语句。除非您在rdd上发布action -

,否则不会打印其内容
print(closest.collect())

声明print("Final centers: " + str(kPoints))有效,因为 kPoints是使用action takeSample -

生成的
kPoints = data.takeSample(False, K, 1)

希望这会有所帮助。请阅读有关rdds的操作和转换操作之间差异的更多信息。