当输入参数是从数据帧的两列连接的值时出现 Spark UDF 错误

Spark UDF error when input parameter is a value concatenated from two columns of a dataframe

以下 python 代码将 csv 文件加载到 dataframe df 并将字符串值从 df 的单个或多个列发送到 UDF 函数 testFunction(...)。如果我发送单个列值,代码工作正常。但是如果我从 df 的两列发送一个值 df.address + " " + df.city,我会得到以下错误:

问题:我可能做错了什么,我们该如何解决这个问题? df 中的所有列都不是 NULL,因此 null 或空字符串不应该是 I 问题。例如,如果我发送单列值 df.address,该值有空格(例如 123 Main Street)。那么,为什么将两列的连接值发送到 UDF 时出错?

错误:

PythonException: An exception was thrown from a UDF: 'AttributeError: 'NoneType' object has no attribute 'upper''

from pyspark.sql.types import StringType
from pyspark.sql import functions as F

df = spark.read.csv(".......dfs.core.windows.net/myDataFile.csv", header="true", inferSchema="true")

def testFunction(value):
  mystr = value.upper().replace(".", " ").replace(",", " ").replace("  ", " ").strip()
  return mystr

newFunction = F.udf(testFunction, StringType())

df2 = df.withColumn("myNewCol", newFunction(df.address + " " + df.city))
df2.show()

在 PySpark 中,您不能使用 + 将 StringType 列连接在一起。它会 return null 破坏你的udf。您可以改用 concat

df2 = df.withColumn("myNewCol", newFunction(F.concat(df.address, F.lit(" "), df.city)))