当输入参数是从数据帧的两列连接的值时出现 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)))
以下 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)))