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
?
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)
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))
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.
Enfin, il y a functools.partial
déjà mentionné par Avihoo Mamka dans les commentaires.