Come un esempio semplificato, ho un dataframe "df" con colonne "col1, col2" e voglio calcolare una riga massima-saggio dopo l'applicazione di una funzione di ciascuna colonna:PySpark row-wise funzione composizione
def f(x):
return (x+1)
max_udf=udf(lambda x,y: max(x,y), IntegerType())
f_udf=udf(f, IntegerType())
df2=df.withColumn("result", max_udf(f_udf(df.col1),f_udf(df.col2)))
Quindi, se df:
col1 col2
1 2
3 0
Poi
DF2:
col1 col2 result
1 2 3
3 0 4
È possibile che questo non sembra funzionare e produce "Impossibile valutare l'espressione: PythonUDF # f ..."
Sono assolutamente positivo "f_udf" funziona bene sul mio tavolo, e il problema principale è con il max_udf.
Senza creare colonne aggiuntive o utilizzare la mappa di base/riduci, c'è un modo per fare tutto quanto sopra usando i dataframes e udfs? Come dovrei modificare "max_udf"?
Ho anche provato:
max_udf=udf(max, IntegerType())
che produce lo stesso errore.
Ho anche confermato che le seguenti opere:
df2=(df.withColumn("temp1", f_udf(df.col1))
.withColumn("temp2", f_udf(df.col2))
df2=df2.withColumn("result", max_udf(df2.temp1,df2.temp2))
Perché è che io non posso fare queste in una volta sola?
Mi piacerebbe vedere una risposta che generalizza a qualsiasi funzione "f_udf" e "max_udf".
Grazie, questa è la prima vera risposta a questa domanda! –
@AlexR. - Se sei soddisfatto di questa risposta, per favore accettala! – proinsias