'list' 对象没有属性 'foreach'

'list' object has no attribute 'foreach'

我正在尝试复制 the given code 以查看 foreach 是如何工作的,我尝试使用以下代码:

rdd = sc.parallelize([1,2,3,4,5])

def f(a):
    print(a)

rdd.collect().foreach(f)

但它给出了以下错误:

AttributeError: 'list' object has no attribute 'foreach'

我理解 return 类型的 collect() 是一个 array(这是列表)的错误,它没有与之关联的 foreach 属性但是,我不明白如果它在官方 spark 3.0.1 文档中给出,这怎么行不通。我错过了什么。我正在使用 Spark 3.0.1

rdd.collect() 是一个将数据收集到驱动程序的 Spark 操作。 collect 方法 returns 一个列表,因此如果你想打印出列表的元素,只需执行:

rdd = sc.parallelize([1,2,3,4,5])

def f(a):
    print(a)

res = rdd.collect()

[f(e) for e in res]

# output
# 1
# 2
# 3
# 4
# 5

另一种方法是使用您示例中提到的另一个操作 foreach,例如 rdd.foreach(f)。虽然,由于 Spark 的分布式特性,无法保证 print 命令会将数据发送到驱动程序的输出流。这实质上意味着您永远看不到打印出来的这些数据。

这是为什么?因为Spark有两种部署模式,clusterclient模式。在集群模式下,驱动程序 运行 在集群中的任意节点中。另一方面,在客户端模式下,驱动程序 运行 在您提交 Spark 作业的机器中,因此,Spark 驱动程序和您的程序共享相同的输出流。因此,您应该始终能够看到程序的输出。

相关链接