【发布时间】: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 ofNone. 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