Подтвердить что ты не робот

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 и arg2 в функцию flaMap?

4b9b3361

Ответ 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)
    
  • Вы можете сгенерировать 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 decorator:

    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 на последнюю позицию. Это не требуется, но таким образом нам не нужно использовать ключевые слова args.

  • Наконец, есть functools.partial, уже упомянутый Avihoo Mamka в комментариях.