PySpark按行函数合成

12 浏览
0 Comments

PySpark按行函数合成

以一个简化的例子来说明,我有一个名为“df”的数据框,其中包含列“col1,col2”,我想在对每一列应用函数之后,计算每一行的最大值:

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

所以如果df的内容如下:

col1   col2
1      2
3      0

那么df2的内容如下:

col1   col2  result
1      2     3
3      0     4

上述方法似乎不起作用,并产生“Cannot evaluate expression: PythonUDF#f…”的错误。我非常确定“f_udf”在我的表格上可以正常工作,主要问题在于“max_udf”。

在不创建额外列或使用基本的map/reduce的情况下,是否有一种方法可以完全使用数据框和UDF来完成上述操作?我应该如何修改“max_udf”?

我也尝试过:

max_udf=udf(max, IntegerType())

它产生相同的错误。

我还确认了以下操作是有效的:

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

为什么我不能一次完成这些操作?

我希望看到一个可以推广到任何函数“f_udf”和“max_udf”的答案。

0