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)

如何将额外的参数 arg1arg2 传递给 flaMap 函数?

  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 already mentioned by Avihoo Mamka