仅在值不为空或不是空字符串的行上应用 UDF 未按预期工作
Applying UDF only on rows where value is not null or not an empty string not working as expected
仅当值不为空或非空字符串时应用 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 子句不能正常工作(或者至少不像我预期的那样)。
我收到空值错误。
我希望 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|
| | |
+------------+------------+
NB:如果过滤掉 bad 行,您的 UDF 会起作用:
df.where(F.col("Name").isNotNull()).select(upperCaseUDF(F.col("Name"))).show()
+--------------+
|<lambda>(Name)|
+--------------+
| JOHN JONES|
| TRACEY SMITH|
| AMY SANDERS|
| |
+--------------+
仅当值不为空或非空字符串时应用 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 子句不能正常工作(或者至少不像我预期的那样)。
我收到空值错误。
我希望 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|
| | |
+------------+------------+
NB:如果过滤掉 bad 行,您的 UDF 会起作用:
df.where(F.col("Name").isNotNull()).select(upperCaseUDF(F.col("Name"))).show()
+--------------+
|<lambda>(Name)|
+--------------+
| JOHN JONES|
| TRACEY SMITH|
| AMY SANDERS|
| |
+--------------+