在pyspark中运行一个简单的应用程序.
f = sc.textFile("README.md") wc = f.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).reduceByKey(add)
我想使用foreach操作查看RDD内容:
wc.foreach(print)
这会引发语法错误:
SyntaxError: invalid syntax
我错过了什么?
此错误是因为print
它不是Python 2.6中的函数.
您可以定义执行打印的帮助程序UDF,也可以使用__future__库print
作为函数处理:
>>> from operator import add >>> f = sc.textFile("README.md") >>> def g(x): ... print x ... >>> wc.foreach(g)
要么
>>> from __future__ import print_function >>> wc.foreach(print)
但是,我认为最好使用collect()
将RDD内容带回驱动程序,因为foreach
在工作节点和输出上的执行可能不一定出现在您的驱动程序/ shell中(它可能在local
模式下,但在运行时不会一个集群).
>>> for x in wc.collect(): ... print x
在Spark 2.0中(我没有使用早期版本进行测试).只是:
print myRDD.take(n)
其中n是行数,myRDD是wc.
试试这个:
data = f.flatMap(lambda x: x.split(' ')) map = data.map(lambda x: (x, 1)) mapreduce = map.reduceByKey(lambda x,y: x+y) result = mapreduce.collect()
请注意,当您运行collect()时,RDD(分布式数据集)将在驱动程序节点聚合,并基本上转换为列表.很明显,收集()2T数据集不是一个好主意.如果您只需要RDD中的几个样本,请使用take(10).
如果你想看到RDD的内容,那么yes collect是一个选项,但是它将所有数据提取给驱动程序,因此可能存在问题
<rdd.name>.take(<num of elements you want to fetch>)
如果你只想看样品,那就更好了
运行foreach并尝试打印,我不推荐这个,因为如果你在集群上运行它,那么打印日志将是执行程序的本地日期,它将打印该执行程序可访问的数据.print语句不会改变状态,因此它在逻辑上不是错误的.要获得所有日志,您将不得不做类似的事情
**Pseudocode** collect foreach print
但这可能会导致作业失败,因为收集驱动程序上的所有数据可能会导致崩溃.我建议使用take命令,或者如果你想分析它,那么在驱动程序上使用sample collect或写入文件然后进行分析.