仅在值不为空或不是空字符串的行上应用UDF [英] Applying UDF only on rows where value is not null or not an empty string not working as expected

查看:14
本文介绍了仅在值不为空或不是空字符串的行上应用UDF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

仅当值不为Null或非空字符串时,应用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值错误。

我预计不会对Null值执行UDF。
这不是关于解决空值的问题,而是为什么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|
|            |            |
+------------+------------+

nb:如果您过滤掉不好的行,则您的UDF工作正常:

df.where(F.col("Name").isNotNull()).select(upperCaseUDF(F.col("Name"))).show()
+--------------+                                                                
|<lambda>(Name)|
+--------------+
|    JOHN JONES|
|  TRACEY SMITH|
|   AMY SANDERS|
|              |
+--------------+

这篇关于仅在值不为空或不是空字符串的行上应用UDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆