Apache spark Pypark应用foreach
我是Pyspark的nooby,我假装玩了一些函数,以便更好地理解如何在更现实的场景中使用它们。有一段时间,我试图对RDD中的每个数字应用一个特定的函数。我的问题是,当我试图打印我从RDD中获取的内容时,结果是没有 我的代码:Apache spark Pypark应用foreach,apache-spark,pyspark,spark-streaming,Apache Spark,Pyspark,Spark Streaming,我是Pyspark的nooby,我假装玩了一些函数,以便更好地理解如何在更现实的场景中使用它们。有一段时间,我试图对RDD中的每个数字应用一个特定的函数。我的问题是,当我试图打印我从RDD中获取的内容时,结果是没有 我的代码: from pyspark import SparkConf , SparkContext conf = SparkConf().setAppName('test') sc = SparkContext(conf=conf) sc.setLogLevel("WARN")
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实现这一点的正确方法是什么,无论是否可行
谢谢您的
div\u two
函数定义似乎很好,但可以简化为
def div_two (n):
return n/2
您已经将整数数组转换为rdd,这也很好
主要问题是,您试图将RDD添加到使用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
变量中,但是rdd
本身是分布式集合,array
也是一个集合。因此,如果将rdd添加到数组中,您将拥有collection of collection,这意味着您应该编写两个循环
changed.append(numbersRDD.map(div_two))
def printing(x):
print x
for i in changed:
i.foreach(printing)
您的代码和我的代码之间的主要区别在于,在向更改的变量添加rdd时,我使用了map(这是一种转换)而不是foreach(这是一种操作)。我使用了两个循环来打印rdd的元素,因为rdd返回单元上的foreach
。是非定型的吗?或者你的意思是numbersRDD.map(lambda x:div_two(x))
?我是指foreach,我将该映射作为注释发布,因为我知道该映射将给我正确的结果,因为它返回一个新的转换RDDOK。对foreach
不工作,因为它不返回任何内容。因此,您添加到列表中的内容本质上是None
。此答案可能仍然有效,但相对而言已经过时。它只涵盖RDD,这在Pyspark中不再常见。我自己也在寻找一个很好的例子来使用PySpark/DataFrames,所以我自己还不能提供一个ansewr。但这只是对未来搜索者的一个警告。回应@DanCiborowski MSFT的评论。如何在pyspark数据帧中使用foreach
?