Spark RDD - 带有额外参数的映射
Spark RDD - Mapping with extra arguments
是否可以将额外的参数传递给 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
already mentioned by Avihoo Mamka了
是否可以将额外的参数传递给 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
already mentioned by Avihoo Mamka了