2016-12-29 6 views
2

私はPythonでSparkを学習しており、誰でもアクションforeach()と変換map()の違いを説明できますか?RDD.foreach()とRDD.map()の相違点

rdd.map()は、Pythonの元のマップ関数のように新しいRDDを返します。しかし、私はrdd.foreach()の機能を見て、違いを理解したい。ありがとう!

答えて

4

非常に簡単な例は、rdd.foreach(print)で、RDDの各行の値は印刷されますが、RDDは変更されません。

は、例えば、これは数字1でRDDを生成 - 10:

>>> 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はどのような方法でRDDを変更しないので役に立たないことforeachを使用した場合しかし、:

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

Noneの呼び出しではNoneの値が返され、その値は欲しくなく、保存したくないので、返すことは無駄です。 (printが実行されているとあなたがtakeを呼び出すまでRDDが遅延して実行されているので、彼らは表示されません。しかし、RDDの内容Noneのちょうど束している12などでラインを注意してください。

あなたは、関数の戻り値を気にしている場合

もっと単純に、mapを呼び出します。そうしない場合foreachを呼び出します。あなたは内の各要素に関数を適用するマップを実行するとき

+0

rdd.foreach(print)は、構文エラーを返します。私は私の質問は違いは何だと思いますか?変換マップ()とアクションforeach()は、私と同じであるようです。 –

+0

@ChenxiZengはうまくいけばもっと明確な答えで更新します。しかし、 –

+0

ありがとう、しかし、... map(print)はまだ構文エラー(Python2.7)を返します。私の理解は、.foreach()はprintやprintなどのアクションを実行するのに便利で、.mapは別のデータセット(RDD)を作成することです。これは正しいですか? –

1

地図は、このように、変換であり、 RDDを呼び出して、追加の変換やアクションを呼び出せる新しいRDDを返します。

Foreachはアクションであり、各要素を受け取り、関数を適用しますが、値を返しません。これは、RDDで計算を実行して、データベースなどの別の場所に結果を記録するか、RDD内の各要素を含むREST APIを呼び出す必要がある場合に特に便利です。

たとえば、別のシステムにログインするたくさんのクエリを持つRDDがあるとします。クエリはRDDに保存されます。

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

は、その後、あなたは今、あなたはRDDの各要素に対してlog_queryを実行している別のAPI

import urllib2 

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

queries.foreach(call_search) 

への呼び出しを介して他のシステムでは、これらのクエリを保存しておきたいです。あなたが地図を作ったなら、あなたが行動を呼ぶまで、まだ何も起こっていないでしょう。

関連する問題