2016-08-29 7 views
0

スパークは2つのRDDを結合するzip()関数を持っています。また、それらを再び分割する機能があります:keys()values()。しかし、驚いたことに、keys()だけを求めると、値が計算に必要でない場合でも、両方のRDDが完全に計算されます。スパーク:計算値なしの圧縮キーの抽出

この例では、私は(key, value)のペアのRDDを作成しますが、私はキーだけを要求します。とにかく値が計算されるのはなぜですか?このような場合、Sparkは内部DAGを簡素化しようとしませんか?

In [1]: def process_value(val): 
    ...:  print "Processing {}".format(val) 
    ...:  return 2*val 
    ...: 

In [2]: k = sc.parallelize(['a','b','c']) 

In [3]: v = sc.parallelize([1,2,3]).map(process_value) 

In [4]: zipped = k.zip(v) 

In [5]: zipped.keys().collect() 
Processing 1 
Processing 2 
Processing 3 

Out[5]: ['a', 'b', 'c'] 

答えて

2

あなたは()単に

rdd.map(_._1)

すなわちとして実装されてsource(少なくともで2.0)のキーを見ればタプルの最初の属性を返すので、タプルは完全にインスタンス化されなければなりません。

これは、zipがRDD[Seq[K, V]]またはその他の遅延データ構造を返したが、タプルが遅延データ構造ではない場合に有効でした。

要約:いいえ。

+0

ありがとうございました。値の計算を避ける 'keys()'の代わりがあるかどうか知っていますか? –

+0

私は決してエキスパートではありませんが、RDDが本当に自分の価値観を十分に把握しているとは思っていません。 – placeybordeaux