Pyspark应用foreach

时间:2018-01-25 03:37:47

标签: apache-spark pyspark spark-streaming

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

我的代码:

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) 

我很欣赏一个明确的解释,为什么在列表中出现这种情况,以及使用foreach实现这一目标的正确方法是否可行。

谢谢

1 个答案:

答案 0 :(得分:2)

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)

您应该打印结果。

您仍然可以将rdd添加到array变量,但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

的元素