如何在Python Spark中查看RDD内容?

55 投票
6 回答
166189 浏览
提问于 2025-04-18 17:12

在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 个回答

6

如果你想查看RDD的内容,使用collect是一个选择,但它会把所有数据都拉到驱动程序那里,这可能会导致一些问题。

<rdd.name>.take(<num of elements you want to fetch>)

如果你只是想看一部分数据,那样做更好。

使用foreach来打印数据,我不太推荐这样做,因为如果你在集群上运行这个,打印的日志只会在执行这个任务的机器上显示,而不是在你的主机器上。这样打印出来的内容只对那个执行器能访问的数据有效。虽然print语句本身没有改变任何状态,所以从逻辑上讲并没有错,但如果你想看到所有的日志,你需要做一些像下面这样的事情:

**Pseudocode**
collect
foreach print

不过这样做可能会导致任务失败,因为把所有数据都收集到驱动程序上可能会让它崩溃。我建议你使用take命令,或者如果你想分析数据,可以用sample在驱动程序上收集一部分数据,或者把数据写到文件里再进行分析。

7

试试这个:

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)。

8

你可以简单地把整个 RDD 收集起来(这会返回一份行的列表),然后打印出这个列表:

print(wc.collect())
49

在Spark 2.0版本中(我没有测试过更早的版本),你可以简单地这样做:

print myRDD.take(n)

这里的n代表行数,而myRDD就是你所提到的wc

48

这个错误是因为在 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

撰写回答