web-dev-qa-db-fra.com

Spark RDD - Mappage avec des arguments supplémentaires

Est-il possible de passer des arguments supplémentaires à la fonction de mappage dans pySpark? Plus précisément, j'ai la recette de code suivante:

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)

La fonction processDataLine prend des arguments supplémentaires en plus de l'objet JSON, comme:

def processDataLine(dataline, arg1, arg2)

Comment passer les arguments supplémentaires arg1 et arg2 à la fonction flaMap?

27
Stan
  1. Vous pouvez utiliser une fonction anonyme soit directement dans un flatMap

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

    ou au curry processDataLine

    f = lambda j: processDataLine(dataline, arg1, arg2)
    json_data_rdd.flatMap(f)
    
  2. Vous pouvez générer processDataLine comme ceci:

    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 la bibliothèque fournit un décorateur curry utile:

    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))
    

    Notez que j'ai poussé l'argument dataline à la dernière position. Ce n'est pas obligatoire mais de cette façon, nous n'avons pas à utiliser d'arguments de mots clés.

  4. Enfin, il y a functools.partial déjà mentionné par Avihoo Mamka dans les commentaires.

40
zero323