RDD.foreach()和RDD.map()之间的区别

Che*_*eng 2 apache-spark pyspark

我正在Python中学习Spark,想知道有人能解释操作foreach()和转换之间的区别map()吗?

rdd.map()返回一个新的RDD,就像Python中的原始map函数一样。但是,我想查看一个rdd.foreach()功能并了解它们之间的差异。谢谢!

Oli*_*ain 6

一个非常简单的示例将是rdd.foreach(print)在RDD中打印每一行的值,而不以任何方式修改RDD。

例如,这将产生带有数字1-10的RDD:

>>> rdd = sc.parallelize(xrange(0, 10)).map(lambda x: x + 1)
>>> rdd.take(10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

map调用为每一行计算了一个新值,并返回了它,以便获得新的RDD。但是,如果我使用了foreach那将是无用的,因为foreach它不会以任何方式修改rdd:

>>> rdd = sc.parallelize(range(0, 10)).foreach(lambda x: x + 1)
>>> type(rdd)
<class 'NoneType'>
Run Code Online (Sandbox Code Playgroud)

相反,调用map返回None类似的函数print不是很有用:

>>> rdd = sc.parallelize(range(0, 10)).map(print)
>>> rdd.take(10)
0
1
2
3
4
5
6
7
8
9
[None, None, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

print调用返回None,从而映射只是给你一堆的None价值观和你不想这些值,你不想救他们,让他们返回是一种浪费。(请注意,带有12等的行print正在执行,直到您调用后它们才会显示,take因为RDD是延迟执行的。但是RDD 的内容只是一堆None

更简单地,map如果您关心函数的返回值,则调用。foreach如果没有,请致电。


xmo*_*era 5

Map 是一种转换,因此当您执行映射时,您将一个函数应用于 RDD 中的每个元素并返回一个新的 RDD,其中可以调用其他转换或操作。

Foreach 是一个动作,它接受每个元素并应用一个函数,但它不返回值。这在您必须对 RDD 调用执行一些计算并将结果记录在其他地方时特别有用,例如数据库或使用 RDD 中的每个元素调用 REST API。

例如,假设您有一个 RDD,其中包含许多您希望登录另一个系统的查询。查询存储在 RDD 中。

queries = <code to load queries or a transformation that was applied on other RDDs>
Run Code Online (Sandbox Code Playgroud)

然后您想通过调用另一个 API 将这些查询保存在另一个系统中

import urllib2

def log_search(q):
    response = urllib2.urlopen('http://www.bigdatainc.org/save_query/' + q)

queries.foreach(log_search)
Run Code Online (Sandbox Code Playgroud)

现在您已经在 RDD 的每个元素上执行了 log_query。如果你已经完成了一张地图,那么在你调用一个动作之前,什么都不会发生。