python-3.x - 仅在值不为空或不是空字符串的行上应用 UDF 未按预期工作

标签 python-3.x pyspark user-defined-functions

仅当值不为空或不是空字符串时,应用 UDF 的最佳(最快)方法是什么。
我添加了一个简单的例子。

df = spark.createDataFrame(
    [["John Jones"], ["Tracey Smith"], [None], ["Amy Sanders"], [""]]
).toDF("Name")


def upperCase(str):
    return str.upper()


upperCaseUDF = udf(lambda z: upperCase(z), StringType())

df.withColumn(
    "Cureated Name",
    F.when(
        ((F.col("Name").isNotNull()) | (F.trim(F.col("name")) != "")),
        upperCaseUDF(F.col("Name")),
    ),
)

AttributeError: 'NoneType' object has no attribute 'upper'. 
我不认为 when 子句工作正常(或者至少不像我期望的那样)。
我收到 Null 值错误。
我希望 UDF 不会在 Null 值上执行。
这不是关于解决 Null 值,而是为什么 when 子句不像我期望的那样工作!

最佳答案

我建议您考虑将您的 UDF 应用于整个数据帧并因此调整代码:

@F.udf
def upperCase(in_string):
    return in_string.upper() if in_string else in_string


df.withColumn(
    "Created_Name",
    upperCase(F.col("Name")),
).show()

+------------+------------+
|        Name|Created_Name|
+------------+------------+
|  John Jones|  JOHN JONES|
|Tracey Smith|TRACEY SMITH|
|        null|        null|
| Amy Sanders| AMY SANDERS|
|            |            |
+------------+------------+

备注 :如果您过滤掉坏行,您的 UDF 就可以工作:
df.where(F.col("Name").isNotNull()).select(upperCaseUDF(F.col("Name"))).show()
+--------------+                                                                
|<lambda>(Name)|
+--------------+
|    JOHN JONES|
|  TRACEY SMITH|
|   AMY SANDERS|
|              |
+--------------+

关于python-3.x - 仅在值不为空或不是空字符串的行上应用 UDF 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68347679/

相关文章:

apache-spark - PySpark3 将 yyyyMMddhhmmss 解析为 TimestampType() 时没有属性 'tzinfo' 错误

sql-server-2008 - 将空列表传递给标量函数上的用户定义的表类型参数

python - Python 2 和 Python 3 中 type() 函数的区别

hadoop - HDFS “files”是目录

apache-spark - 如何查看 SPARK 发送到我的数据库的 SQL 语句?

javascript - 如何通过 start : stop: while using the parameters 'ev' and 'ui' ? 使用我自己的函数

sql-server - TSQL UDF每8个字符拆分字符串

python - 插入不使用 Python 的数据库表

python - 使用 Python 从单尾分布生成范围内的随机数

Python 网络爬行抛出连接错误