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