2016-09-26 7 views
0

マップを適用してから、pysparkを使用してRDDでreduceByKey変換を行います。私は、次の構文の両方を試みたが、それらの両方が動作するようです:pyspark:reducedByKeyの対表現のための(、)と[、]の使用の違い

ケース1:

my_rdd_out = my_rdd.map(lambda r: [r['my_id'], [[r['my_value']]]])\ 
           .reduceByKey(lambda a, b: a+b)\ 
           .map(lambda r: r[1]) 

ケース2:

my_rdd_out = my_rdd.map(lambda r: (r['my_id'], [[r['my_value']]]))\ 
           .reduceByKey(lambda a, b: a+b)\ 
           .map(lambda r: r[1]) 

ここでrはクラスfrom pyspark.sql import Rowです。 ケース1の場合、マップ出力ペアは括弧で囲まれています。ケース2の場合、マップ出力ペアはかっこ内にあります。どちらの作品も、後でreduceByKeyの入力となるペアを表すために[]と()を使用することに違いがあるのでしょうか?ありがとう!

答えて

1

pythonのtuplelistの違いは、tupleオブジェクトが不変であり、ハッシュ可能なことです。 listオブジェクトは参照を使用して変更できるため、ハッシュ可能ではありません。

いずれの場合でも使用できます(またはreduceByKeyメソッドはタプルとリストの両方に適用されません)。一部の呼び出し元からオブジェクトを取得したときに別のものにキャストするのは避けて便利ですコレクションを繰り返し処理するだけで、コレクションの種類は気にしません)。ここ

は、あなたがtuple(<something>).reduceByKey(lambda <something>)を持っているあなたの例ではhere

def reduceByKey(func, iterable): 
    """Reduce by key. 
    Equivalent to the Spark counterpart 
    Inspired by http://stackoverflow.com/q/33648581/554319 
    1. Sort by key 
    2. Group by key yielding (key, grouper) 
    3. For each pair yield (key, reduce(func, last element of each grouper)) 
    """ 
    get_first = lambda p: p[0] 
    get_second = lambda p: p[1] 
    # iterable.groupBy(_._1).map(l => (l._1, l._2.map(_._2).reduce(func))) 
    return map(
     lambda l: (l[0], reduce(func, map(get_second, l[1]))), 
     groupby(sorted(iterable, key=get_first), get_first) 
    ) 

から持ち上げreduceByKeyの実装です。明らかに、繰り返し可能なものはtupleであり、funcはラムダ式です。

ご覧のとおり、入力は繰り返し可能である必要があります。インデックスへのアクセスは必要ありません。

あなたはsetdeque、発生者の理解度に合格することができました。これは、リストまたはタプルの変換を何も含んでいません。

一度に1つのデータだけを同時に取得する必要はありません(ジェネレータ関数/補題も機能します):無駄な一時オブジェクトの作成を回避するエレガントな方法。

これはiterablelistを生成sorted機能とここケースである、関数の中で一度だけを通して繰り返されることが必要です。

+0

reduceByKeyはreduceByKeyを実行する前に実際にリストをタプルにキャストしますか?どの形式がより形式的/標準的ですか?ありがとう! – Edamame

+1

私の編集を参照してください(そのために編集が必要でした)。キャストはありません。利便性に応じてフォーマットを選択してください。関数を呼び出すためにのみ作成されたタプル/リストの場合は、選択が難しいですが、私は同意します。 –

+0

こんにちはジャンフランソワ、詳細情報をありがとうございます。 def reduceByKey(func、iterable)の実装を理解しようとしています。私の例では、関数funcとiterableが必要です:reduceByKey(lambda a、b:a + b)?どうもありがとう! – Edamame

関連する問題