如何解决“列表”对象没有属性“ foreach”
我试图复制the given code来查看foreach
的工作方式,我尝试使用以下代码:
rdd = sc.parallelize([1,2,3,4,5])
def f(a):
print(a)
rdd.collect().foreach(f)
但是会出现以下错误:
AttributeError:“列表”对象没有属性“ foreach”
我理解以下错误:collect()
的返回类型是array
(属于列表),并且没有与之关联的foreach
属性,但是我不明白如果在官方spark 3.0.1
文档中给出了说明,那么该方法将不起作用。我想念什么。我正在使用Spark 3.0.1
解决方法
rdd.collect()
是一个Spark动作,它将数据收集到驱动程序。 collect
方法返回一个列表,因此,如果要打印出列表的元素,只需执行以下操作:
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有两种部署模式,即cluster
和client
模式。在群集模式下,驱动程序在群集中的任意节点中运行。在另一方面,在客户端模式下,驱动程序在您提交了Spark作业的计算机中运行,因此,Spark驱动程序和您的程序共享相同的输出流。因此,您应该始终能够看到程序的输出。
相关链接
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。