PySpark按行函数合成
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”的答案。