AttributeError:模块“pyspark.sql.types”没有属性“ListType”
Posted
技术标签:
【中文标题】AttributeError:模块“pyspark.sql.types”没有属性“ListType”【英文标题】:AttributeError: module 'pyspark.sql.types' has no attribute 'ListType' 【发布时间】:2020-10-14 19:18:14 【问题描述】:我定义了一个 UDF,它将返回 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'
【问题讨论】:
【参考方案1】: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
【讨论】:
以上是关于AttributeError:模块“pyspark.sql.types”没有属性“ListType”的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:“元组”对象在 pyspark 中没有属性“startswith”
获取 AttributeError:“OneHotEncoder”对象没有属性“pyspark 中的 _jdf”
在 PySpark 中展开 json 列 - 架构问题 - AttributeError: 'tuple' object has no attribute 'name'
在 Pyspark 中使用 contains 和 udf 时出现问题:AttributeError: 'NoneType' object has no attribute 'lower'
Pyspark ml 无法拟合模型并且总是“AttributeError:'PipelinedRDD' 对象没有属性'_jdf'
将 rdd 转换为数据框:AttributeError: 'RDD' object has no attribute 'toDF' using PySpark