gpt4 book ai didi

python - PySpark。将 Dataframe 传递给 pandas_udf 并返回一个系列

转载 作者:行者123 更新时间:2023-12-02 20:11:27 36 4
gpt4 key购买 nike

我正在使用 PySpark 的新 pandas_udf 装饰器,我试图让它将多个列作为输入并返回一个系列作为输入,但是,我收到一个 TypeError : 无效参数

示例代码

@pandas_udf(df.schema, PandasUDFType.SCALAR)
def fun_function(df_in):
df_in.loc[df_in['a'] < 0] = 0.0
return (df_in['a'] - df_in['b']) / df_in['c']

最佳答案

A SCALAR udf期望 pandas 系列作为输入而不是数据框。对于您的情况,无需使用 udf。剪切后从 abc 列直接计算应该可以:

import pyspark.sql.functions as f

df = spark.createDataFrame([[1,2,4],[-1,2,2]], ['a', 'b', 'c'])

clip = lambda x: f.when(df.a < 0, 0).otherwise(x)
df.withColumn('d', (clip(df.a) - clip(df.b)) / clip(df.c)).show()

#+---+---+---+-----+
#| a| b| c| d|
#+---+---+---+-----+
#| 1| 2| 4|-0.25|
#| -1| 2| 2| null|
#+---+---+---+-----+

如果您必须使用 pandas_udf,您的返回类型需要为 double,而不是 df.schema,因为您只返回 pandas 系列而不是 pandas 数据框;而且您还需要将列作为系列传递到函数中,而不是整个数据框:

@pandas_udf('double', PandasUDFType.SCALAR)
def fun_function(a, b, c):
clip = lambda x: x.where(a >= 0, 0)
return (clip(a) - clip(b)) / clip(c)

df.withColumn('d', fun_function(df.a, df.b, df.c)).show()
#+---+---+---+-----+
#| a| b| c| d|
#+---+---+---+-----+
#| 1| 2| 4|-0.25|
#| -1| 2| 2| null|
#+---+---+---+-----+

关于python - PySpark。将 Dataframe 传递给 pandas_udf 并返回一个系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541855/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com