gpt4 book ai didi

apache-spark - Pyspark 申请 foreach

转载 作者:行者123 更新时间:2023-12-04 03:01:55 31 4
gpt4 key购买 nike

我是 Pyspark 的菜鸟,我假装玩了几个函数来更好地理解如何在更现实的场景中使用它们。有一段时间,我尝试将特定函数应用于 RDD 中的每个数字。我的问题基本上是,当我尝试打印从 RDD 中抓取的内容时,结果是 None

我的代码:

from pyspark import SparkConf , SparkContext

conf = SparkConf().setAppName('test')
sc = SparkContext(conf=conf)

sc.setLogLevel("WARN")


changed = []

def div_two (n):
opera = n / 2
return opera

numbers = [8,40,20,30,60,90]

numbersRDD = sc.parallelize(numbers)

changed.append(numbersRDD.foreach(lambda x: div_two(x)))

#result = numbersRDD.map(lambda x: div_two(x))

for i in changed:
print(i)

我很欣赏关于为什么这会在列表中出现 Null 以及使用 foreach 实现这一目标的正确方法(无论是否可能)的明确解释。

谢谢

最佳答案

您对 div_two 的函数定义似乎还可以减少到

def div_two (n):
return n/2

并且您已将整数数组转换为 rdd,这也很好。

主要问题是您试图将 rdds 添加到使用 foreach 更改的数组中。功能 .但是如果你看看 foreach 的定义
def foreach(self, f) Inferred type: (self: RDD, f: Any) -> None

这表示返回类型是 None .这就是正在打印的内容。

您不需要数组变量来打印 RDD 的更改元素。您可以简单地编写一个用于打印的函数并在 foreach 中调用该函数。功能
def printing(x):
print x

numbersRDD.map(div_two).foreach(printing)

您应该打印结果。

您仍然可以添加 rddarray可变但rdds本身是分布式集合和Array也是一个集合。因此,如果您将 rdd 添加到数组中,您将拥有集合的集合,这意味着您应该编写两个循环
changed.append(numbersRDD.map(div_two))

def printing(x):
print x

for i in changed:
i.foreach(printing)

您的代码和我的代码之间的主要区别在于,在将 rdd 添加到更改的变量 时,我使用了 map(这是一种转换)而不是 foreach(这是一种操作)。 .我使用了两个循环来打印 rdd 的元素

关于apache-spark - Pyspark 申请 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48435249/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com