簡體   English   中英

RDD.foreach() 和 RDD.map() 的區別

[英]Difference between RDD.foreach() and RDD.map()

我正在用 Python 學習 Spark,想知道有人能解釋一下foreach()和轉換map()之間的區別嗎?

rdd.map()返回一個新的 RDD,就像 Python 中的原始 map 函數一樣。 但是,我想查看rdd.foreach()函數並了解差異。 謝謝!

一個非常簡單的例子是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]

map調用為每一行計算一個新值並返回它,以便我得到一個新的 RDD。 但是,如果我使用foreach那就沒用了,因為foreach不會以任何方式修改 rdd:

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

相反,在像print一樣返回None的函數上調用map不是很有用:

>>> 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]

print調用返回None所以映射只會給你一堆None值,你不想要這些值,也不想保存它們,所以返回它們是一種浪費。 (請注意,帶有12等的行是正在執行的print ,它們直到您調用take顯示,因為 RDD 是惰性執行的。然而,RDD 的內容只是一堆None

更簡單地說,如果您關心函數的返回值,請調用map 如果不這樣做,請調用foreach

Map 是一種轉換,因此當您執行映射時,您將一個函數應用於 RDD 中的每個元素並返回一個新的 RDD,其中可以調用其他轉換或操作。

Foreach 是一個動作,它接受每個元素並應用一個函數,但它不返回值。 這在您必須對 RDD 調用執行一些計算並將結果記錄在其他地方時特別有用,例如數據庫或使用 RDD 中的每個元素調用 REST API。

例如,假設您有一個 RDD,其中包含許多您希望登錄另一個系統的查詢。 查詢存儲在 RDD 中。

queries = <code to load queries or a transformation that was applied on other RDDs>

然后您想通過調用另一個 API 將這些查詢保存在另一個系統中

import urllib2

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

queries.foreach(log_search)

現在您已經在 RDD 的每個元素上執行了 log_query。 如果你已經完成了一張地圖,那么在你調用一個動作之前,什么都不會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM