微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“列表”对象没有属性“ foreach”

如何解决“列表”对象没有属性“ 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有两种部署模式,即clusterclient模式。在群集模式下,驱动程序在群集中的任意节点中运行。在另一方面,在客户端模式下,驱动程序在您提交了Spark作业的计算机中运行,因此,Spark驱动程序和您的程序共享相同的输出流。因此,您应该始终能够看到程序的输出。

相关链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。