2017-06-05 10 views
0

テキストまたはリストの要素の数を数えるさまざまな方法があることは知っています。しかし、私はなぜこれが動作しないのか理解しようとしています。結果は3 は私がmy_count(_)と呼ばれる次の関数を定義し、そうすることですどこでSparkを使用してテキストまたはリスト内の要素の数をカウントする

A_RDD=sc.parallelize(['a', 1.2, []]) 

acc = sc.accumulator(0) 
acc.value 
A_RDD.foreach(lambda _: acc.add(1)) 
acc.value 

に同等のコードを記述しようとしていますが、私は結果を取得する方法がわかりません。 A_RDD.foreach(my_count)は何もしません。私もエラーはありませんでした。私は何を間違えたのですか?

counter = 0 #function that counts elements 
def my_count(_): 
    global counter 
    counter += 1 

A_RDD.foreach(my_count) 
+0

メアリー、投稿された回答があなたの質問を明確にするかどうか確認できますか? –

答えて

1

A_RDD.foreach(my_count)操作は、ローカルのPython仮想マシン上で実行されません。これは、リモート実行ノードで実行されます。そのため、ドライブはmy_countメソッドを変数counterと一緒に各実行ノードに送ります。そのメソッドは変数を参照するためです。そのため、各実行ノードには、counterという独自の定義があり、ドライバアプリケーションで定義されている変数counterがインクリメントされていないときにforeachメソッドによって更新されます。

簡単で危険な解決策は、ドライバでRDDを収集し、次にそのようなカウントを計算することです。これは、RDDコンテンツ全体がドライバのメモリにダウンロードされ、MemoryErrorが発生する可能性があるため、危険です。

>>> len(A_RDD.collect()) 
3 
0

ローカルで実行していて、クラスタではない場合はどうなりますか。 spark/scalaでは、この動作はローカルとクラスタの間で変化します。それはローカルに期待どおりの値を持っていますが、クラスタでは、あなたが記述したのと同じ値を持たないでしょう... spark/pythonでは同じことが起こりますか?私の推測はそうです。

関連する問題