attributeerror:模块“pyspark.sql.types”没有属性“listtype”

k3bvogb1  于 2021-05-22  发布在  Spark
关注(0)|答案(1)|浏览(473)

我定义了一个自定义项,它将返回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”

az31mfrm

az31mfrm1#

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 decorator,在开发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

相关问题