[英]How to apply if else udf pandas to pyspark dataframe on a column?
我想要一个正确的 udf 并申请 dataframe
创建 Spark df:
df = spark.createDataFrame([(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)], ("id", "v"))
pandas function:
@udf("integer")
def add_con(x : pd.Series):
if x>5:
return x*x
else:
return x
df.printSchema()
df.withColumn('new', add_con(df.v)).show()
Output (请更正udf) :
root
|-- id: long (nullable = true)
|-- v: double (nullable = true)
+---+----+----+
| id| v| new|
+---+----+----+
| 1| 1.0|null|
| 1| 2.0|null|
| 2| 3.0|null|
| 2| 5.0|null|
| 2|10.0|null|
+---+----+----+
这有效:
from pyspark.sql import functions as f
df.withColumn('new', f.when(df.v > 5, df.v * df.v).otherwise(df.v)).show()
# +---+----+-----+
# | id| v| new|
# +---+----+-----+
# | 1| 1.0| 1.0|
# | 1| 2.0| 2.0|
# | 2| 3.0| 3.0|
# | 2| 5.0| 5.0|
# | 2|10.0|100.0|
# +---+----+-----+
您正在传递浮点字段; 但返回 integer 类型。 此外,不需要参数类型pd.Series
。
这里是 go:
df = spark.createDataFrame([(1, 1.0), (1, 2.0), (2, 3.0), (2, 5.0), (2, 10.0)]).toDF(*["id", "v"])
@udf("float")
def add_con(x):
if x>5:
return x*x
else:
return x
#
df.withColumn('new', add_con(df.v)).show()
这将是工作pandas_udf
:
@F.pandas_udf("integer")
def add_con(x: pd.Series) -> pd.Series:
return pd.Series([e*e if e>5 else e for e in x])
df.withColumn('new', add_con(df.v)).show()
# +---+----+---+
# | id| v|new|
# +---+----+---+
# | 1| 1.0| 1|
# | 1| 2.0| 2|
# | 2| 3.0| 3|
# | 2| 5.0| 5|
# | 2|10.0|100|
# +---+----+---+
对你来说它不起作用,因为你想直接使用pd.Series
object 进行操作。 如果您使用pd.Series
的元素并稍后将结果转换回pd.Series
,则它可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.