繁体   English   中英

如果其他情况下,如何在列上应用 udf pandas 到 pyspark dataframe?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM