web-dev-qa-db-ja.com

Spark RDD-追加の引数を使用したマッピング

PySparkのマッピング関数に追加の引数を渡すことは可能ですか?具体的には、次のコードレシピがあります。

raw_data_rdd = sc.textFile("data.json", use_unicode=True)
json_data_rdd = raw_data_rdd.map(lambda line: json.loads(line))
mapped_rdd = json_data_rdd.flatMap(processDataLine)

関数processDataLineは、JSONオブジェクトに加えて、追加の引数を取ります。

def processDataLine(dataline, arg1, arg2)

追加の引数arg1およびarg2flaMap関数に渡すにはどうすればよいですか?

27
Stan
  1. 無名関数は、flatMapで直接使用できます

    json_data_rdd.flatMap(lambda j: processDataLine(j, arg1, arg2))
    

    またはprocessDataLineをカレーします

    f = lambda j: processDataLine(dataline, arg1, arg2)
    json_data_rdd.flatMap(f)
    
  2. 次のようにprocessDataLineを生成できます:

    def processDataLine(arg1, arg2):
        def _processDataLine(dataline):
            return ... # Do something with dataline, arg1, arg2
        return _processDataLine
    
    json_data_rdd.flatMap(processDataLine(arg1, arg2))
    
  3. toolz ライブラリは便利なcurryデコレータを提供します:

    from toolz.functoolz import curry
    
    @curry
    def processDataLine(arg1, arg2, dataline): 
        return ... # Do something with dataline, arg1, arg2
    
    json_data_rdd.flatMap(processDataLine(arg1, arg2))
    

    dataline引数を最後の位置にプッシュしたことに注意してください。必須ではありませんが、この方法ではキーワード引数を使用する必要はありません。

  4. 最後に functools.partial すでに Avihoo Mamka でコメントに言及されています。

40
zero323