【问题标题】:Pyspark applying foreachPyspark 应用 foreach
【发布时间】:2018-07-04 06:02:58
【问题描述】:

我是 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 实现这一目标的正确方法应该是什么。

谢谢

【问题讨论】:

  • 因为 RDD 上的 foreach 返回 Unit。
  • 对不起@Psidom你能详细说明你的答案吗我很感激谢谢
  • 看看numbersRDD.foreach(lambda x: div_two(x))。是无类型吗?还是你的意思是numbersRDD.map(lambda x: div_two(x))
  • 我的意思是 foreach ,我发布了地图作为评论,因为我知道地图会给我正确的结果,因为它返回一个新的转换 RDD
  • 好的。是的。 foreach 不起作用,因为它不返回任何内容。所以你附加到列表中的基本上是None

标签: apache-spark pyspark spark-streaming


【解决方案1】:

div_two 的函数定义看起来不错,但可以简化为

def div_two (n):
    return n/2

并且您已经将 integers 的数组转换为 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 添加到数组中,您将拥有 collectioncollection,这意味着您应该编写两个循环

changed.append(numbersRDD.map(div_two))

def printing(x):
    print x

for i in changed:
    i.foreach(printing)

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

【讨论】:

  • 这个答案可能仍然有效,但相对已过时。它仅涵盖在 Pyspark 中不再常见的 RDD。我自己正在寻找一个很好的例子来使用 PySpark/DataFrames 来做这件事,所以我自己还不能提供一个答案。但只是对未来搜索者的警告。
  • 回应@DanCiborowski-MSFT 的评论。如何在 pyspark 数据帧中使用 foreach
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2018-06-20
  • 2016-09-26
  • 1970-01-01
  • 2022-12-27
  • 2020-05-21
  • 2020-03-05
相关资源
最近更新 更多