私はPythonでSparkを学習しており、誰でもアクションforeach()
と変換map()
の違いを説明できますか?RDD.foreach()とRDD.map()の相違点
rdd.map()
は、Pythonの元のマップ関数のように新しいRDDを返します。しかし、私はrdd.foreach()
の機能を見て、違いを理解したい。ありがとう!
私はPythonでSparkを学習しており、誰でもアクションforeach()
と変換map()
の違いを説明できますか?RDD.foreach()とRDD.map()の相違点
rdd.map()
は、Pythonの元のマップ関数のように新しいRDDを返します。しかし、私はrdd.foreach()
の機能を見て、違いを理解したい。ありがとう!
非常に簡単な例は、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
のちょうど束している1
、2
などでラインを注意してください。
もっと単純に、map
を呼び出します。そうしない場合foreach
を呼び出します。あなたは内の各要素に関数を適用するマップを実行するとき
地図は、このように、変換であり、 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)
への呼び出しを介して他のシステムでは、これらのクエリを保存しておきたいです。あなたが地図を作ったなら、あなたが行動を呼ぶまで、まだ何も起こっていないでしょう。
rdd.foreach(print)は、構文エラーを返します。私は私の質問は違いは何だと思いますか?変換マップ()とアクションforeach()は、私と同じであるようです。 –
@ChenxiZengはうまくいけばもっと明確な答えで更新します。しかし、 –
ありがとう、しかし、... map(print)はまだ構文エラー(Python2.7)を返します。私の理解は、.foreach()はprintやprintなどのアクションを実行するのに便利で、.mapは別のデータセット(RDD)を作成することです。これは正しいですか? –