在PythonSpark中查看RDD内容?

2024-05-14 13:30:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

我错过了什么?


Tags: lambdaadd应用程序mapmdreadmepysparksplit
3条回答

如果您想查看RDD的内容,那么yes collect是一个选项,但是它会将所有数据提取到driver,这样就可能出现问题

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

如果你只想看看样品

运行foreach并尝试打印,我不建议这样做,因为如果您在集群上运行此操作,则打印日志将是执行器本地的,并且它将打印该执行器可访问的数据。print语句没有更改状态,因此逻辑上没有错误。要得到所有的日志,你必须做一些

**Pseudocode**
collect
foreach print

但这可能会导致作业失败,因为收集驱动程序上的所有数据可能会使其崩溃。我建议使用take命令,或者如果您想分析它,则使用samplecollect on driver或write to file,然后对其进行分析。

这个错误是因为print不是Python 2.6中的函数。

您可以定义执行打印的助手自定义项,或者使用__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是行数,myRDDwc

相关问题 更多 >

    热门问题