【问题标题】:Applying UDF only on rows where value is not null or not an empty string not working as expected仅在值不为空或不是空字符串的行上应用 UDF 不能按预期工作
【发布时间】:2021-09-21 15:19:31
【问题描述】:

仅当值不为 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 值出现错误。

我希望 UDF 不会在 Null 值上执行。
这不是解决 Null 值,而是为什么 when 子句不能像我预期的那样工作!

【问题讨论】:

  • 你的问题在于upperCaseUDF = udf(lambda z:upperCase(z),StringType())''', since you have an attribute with a value of None. NoneType has no attribute '''upper()''. You can fix this easily by updating the function ```upperCase 检测到 None 值并返回一些东西,否则返回 value.upper()
  • @itprorh66 如前所述,我理解错误,但为什么在有 Null 值时应用 UDF?看起来 when 子句被忽略了。我不想检查 UDF 中的 Null 值,只是在值为 Null 或空字符串时不应用 UDF
  • 我认为优化器为了节省计算时间,计算真假输出,然后根据when结果选择合适的输出。
  • @Steven :这取决于数据集的大小吗?我的真实案例是一个(非常)大的数据集,我注意到了同样的行为。
  • @JohnDoe 与大小无关。

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


【解决方案1】:

我建议您考虑您的 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|
|            |            |
+------------+------------+

注意:如果您过滤掉 bad 行,您的 UDF 就可以工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2019-10-24
    • 2011-05-17
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多