Composição da função de linha do PySpark

Como um exemplo simplificado, tenho um quadro de dados "df" com as colunas "col1, col2" e quero calcular o máximo em linhas após aplicar uma função a cada coluna:

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

Então, se df:

col1   col2
1      2
3      0

Então

df2:

col1   col2  result
1      2     3
3      0     4

O texto acima parece não funcionar e produz "Não é possível avaliar a expressão: PythonUDF # f ..."

Estou absolutamente certo de que "f_udf" funciona bem na minha mesa, e o principal problema é com o max_udf.

Sem criar colunas extras ou usar o mapa básico / reduzir, existe uma maneira de fazer o acima descrito usando quadros de dados e udfs? Como devo modificar "max_udf"?

Eu também tentei:

max_udf=udf(max, IntegerType())

que produz o mesmo erro.

Também confirmei que os seguintes trabalhos:

df2=(df.withColumn("temp1", f_udf(df.col1))
       .withColumn("temp2", f_udf(df.col2))

df2=df2.withColumn("result", max_udf(df2.temp1,df2.temp2))

Por que não posso fazer isso de uma só vez?

Gostaria de ver uma resposta que generalize para qualquer função "f_udf" e "max_udf".

questionAnswers(2)

yourAnswerToTheQuestion