如何在Python Spark中查看RDD内容?
在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
我漏掉了什么呢?
6 个回答
如果你想查看RDD的内容,使用collect是一个选择,但它会把所有数据都拉到驱动程序那里,这可能会导致一些问题。
<rdd.name>.take(<num of elements you want to fetch>)
如果你只是想看一部分数据,那样做更好。
使用foreach来打印数据,我不太推荐这样做,因为如果你在集群上运行这个,打印的日志只会在执行这个任务的机器上显示,而不是在你的主机器上。这样打印出来的内容只对那个执行器能访问的数据有效。虽然print语句本身没有改变任何状态,所以从逻辑上讲并没有错,但如果你想看到所有的日志,你需要做一些像下面这样的事情:
**Pseudocode**
collect
foreach print
不过这样做可能会导致任务失败,因为把所有数据都收集到驱动程序上可能会让它崩溃。我建议你使用take命令,或者如果你想分析数据,可以用sample在驱动程序上收集一部分数据,或者把数据写到文件里再进行分析。
试试这个:
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(分布式数据集)会在主节点上被聚合,基本上会变成一个列表。所以,显然,收集一个2TB的数据集并不是个好主意。如果你只需要从你的RDD中取几个样本,可以用 take(10)。
你可以简单地把整个 RDD 收集起来(这会返回一份行的列表),然后打印出这个列表:
print(wc.collect())
在Spark 2.0版本中(我没有测试过更早的版本),你可以简单地这样做:
print myRDD.take(n)
这里的n代表行数,而myRDD就是你所提到的wc。
这个错误是因为在 Python 2.6 里,print
不是一个函数。
你可以选择定义一个辅助的用户自定义函数(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
是在工作节点上执行的,输出结果可能不会出现在你的主程序或命令行中(在 local
模式下可能会出现,但在集群上运行时就不一定了)。
>>> for x in wc.collect():
... print x