Je veux utiliser data.groupby.apply () pour appliquer une fonction à chaque ligne de mon fichier de données PYSPark par groupe.
J'ai utilisé la carte groupée Pandas udfs. Cependant, je ne peux pas comprendre comment ajouter un autre argument à ma fonction.
J'ai essayé d'utiliser l'argument comme une variable globale mais la fonction ne le recongénitez pas (mon argument est un fichier de données PYSPark)
[.____] J'ai aussi essayé les solutions proposées dans cette question (pour pandas Dataframe) tilisez Pandas Groupby () + Appliquer () avec des arguments
@pandas_udf(schema,PandasUDFType.GROUPED_MAP)
def function(key,data, interval):
interval_df=interval.filter(interval["var"]==key).toPandas()
for value in interval_df:
#Apply some operations
return Data.groupBy("msn").apply(calc_diff, ('arg1'))
Ou alors
@pandas_udf(schema,PandasUDFType.GROUPED_MAP)
def function(key,data, interval):
interval_df=interval.filter(interval["var"]==key).toPandas()
for value in interval_df:
#Apply some operations
return Data.groupBy("msn").apply(lambda x: calc_diff(x,'arg1'))
Mais j'ai l'erreur:
ValueError: fonction non valide: pandas_udfs avec type de fonction grouped_map doit prendre un argument (données) ou deux arguments (clé, données).
Quelqu'un pourrait-il m'aider avec le problème ci-dessus?.
Merci
Je pense que tu pourrais faire quelque chose comme ça
def myfun(data, key, interval):
#Apply some operations
return something
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def myfun_udf(data):
return myfun(data=data, key=mykey, interval=myinterval)
mykey=1
myinterval=2
Data.groupBy("msn").apply(myfun_udf)
Vous pouvez créer le pandas UDF à l'intérieur de votre fonction, de sorte que les arguments de la fonction soient connus au moment de sa création. (Ou vous pouvez importer des fonctions de fonctionnement et utiliser une évaluation partielle de fonction pour faire de même chose.) Voici le exemple de la documentation de Pyspark, modifié pour réussir certains paramètres:
from pyspark.sql.functions import pandas_udf, PandasUDFType
df = spark.createDataFrame(
[(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)],
("id", "v"))
def my_function(df, by="id", column="v", value=1.0):
schema = "{} long, {} double".format(by, column)
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def subtract_value(pdf):
# pdf is a pandas.DataFrame
v = pdf[column]
g = pdf[by]
return pdf.assign(v = v - g * value)
return df.groupby(by).apply(subtract_value)
my_function(df, by="id", column="v", value=2.0).show()