AttributeError: module 'pyspark.sql.types' has no attribute 'ListType'
AttributeError: module 'pyspark.sql.types' has no attribute 'ListType'
我定义了一个 UDF,它将 return 3 个值。 1 是一个整数值。 2 是一个浮点值,3 是一个列表。
mylist = [8,9.5,10,11,12]
def Calculat(mylist):
x = mylist[0]
y = mylist[1]
list = mylist[-3,-2,-1]
return x, y, list
然后我想运行用这段代码定义3种类型
func = F.udf(lambda x: calculate(x), T.StructType(
[T.StructField("val1", T.IntegerType(), True),
T.StructField("val2", T.FloatType(), True),
T.StructField("val3", T.ListType(), True)]))
但是我得到这个错误
AttributeError: 模块 'pyspark.sql.types' 没有属性 'ListType'
ListType 在 Pyspark 中不可用。您将需要更改为 ArrayType
,它始终需要定义的元素类型。
func = F.udf(lambda x: calculate(x), T.StructType([
T.StructField("val0", T.IntegerType(), True),
T.StructField("val1", T.FloatType(), True),
T.StructField("val2", T.ArrayType(T.IntegerType()), True),
]))
也是我的一个小想法。在开发 UDF 函数时,我非常喜欢 UDF 装饰器。我真的很喜欢这种方法,因为在我看来它使代码看起来更清晰。您的代码如下所示:
returnType=T.StructType([
T.StructField("val0", T.IntegerType(), True),
T.StructField("val1", T.FloatType(), True),
T.StructField("val2", T.ArrayType(T.IntegerType()), True),
])
@F.udf(returnType=returnType)
def calculate(mylist):
x = mylist[0]
y = mylist[1]
list = mylist[-3,-2,-1]
return x, y, list
我定义了一个 UDF,它将 return 3 个值。 1 是一个整数值。 2 是一个浮点值,3 是一个列表。
mylist = [8,9.5,10,11,12]
def Calculat(mylist):
x = mylist[0]
y = mylist[1]
list = mylist[-3,-2,-1]
return x, y, list
然后我想运行用这段代码定义3种类型
func = F.udf(lambda x: calculate(x), T.StructType(
[T.StructField("val1", T.IntegerType(), True),
T.StructField("val2", T.FloatType(), True),
T.StructField("val3", T.ListType(), True)]))
但是我得到这个错误
AttributeError: 模块 'pyspark.sql.types' 没有属性 'ListType'
ListType 在 Pyspark 中不可用。您将需要更改为 ArrayType
,它始终需要定义的元素类型。
func = F.udf(lambda x: calculate(x), T.StructType([
T.StructField("val0", T.IntegerType(), True),
T.StructField("val1", T.FloatType(), True),
T.StructField("val2", T.ArrayType(T.IntegerType()), True),
]))
也是我的一个小想法。在开发 UDF 函数时,我非常喜欢 UDF 装饰器。我真的很喜欢这种方法,因为在我看来它使代码看起来更清晰。您的代码如下所示:
returnType=T.StructType([
T.StructField("val0", T.IntegerType(), True),
T.StructField("val1", T.FloatType(), True),
T.StructField("val2", T.ArrayType(T.IntegerType()), True),
])
@F.udf(returnType=returnType)
def calculate(mylist):
x = mylist[0]
y = mylist[1]
list = mylist[-3,-2,-1]
return x, y, list