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
およびarg2
をflaMap
関数に渡すにはどうすればよいですか?
無名関数は、flatMap
で直接使用できます
json_data_rdd.flatMap(lambda j: processDataLine(j, arg1, arg2))
またはprocessDataLine
をカレーします
f = lambda j: processDataLine(dataline, arg1, arg2)
json_data_rdd.flatMap(f)
次のようにprocessDataLine
を生成できます:
def processDataLine(arg1, arg2):
def _processDataLine(dataline):
return ... # Do something with dataline, arg1, arg2
return _processDataLine
json_data_rdd.flatMap(processDataLine(arg1, arg2))
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
引数を最後の位置にプッシュしたことに注意してください。必須ではありませんが、この方法ではキーワード引数を使用する必要はありません。
最後に functools.partial
すでに Avihoo Mamka でコメントに言及されています。