Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Pypark应用foreach_Apache Spark_Pyspark_Spark Streaming - Fatal编程技术网

Apache spark Pypark应用foreach

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")

我是Pyspark的nooby,我假装玩了一些函数,以便更好地理解如何在更现实的场景中使用它们。有一段时间,我试图对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实现这一点的正确方法是什么,无论是否可行


谢谢

您的
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