python 对象(3)的长度与字段(1)的长度不匹配

g2ieeal7  于 2023-02-11  发布在  Python
关注(0)|答案(2)|浏览(133)

下面的代码有问题。我想创建一个单列 Dataframe 。我可以知道我在这里做错了什么吗?

from pyspark.sql import functions as F from pyspark.sql.types import IntegerType,ArrayType,StructType,StructField,StringType data = [ (["James","Jon","Jane"]), (["Miken","Mik","Mike"]), (["John","Johns"])]
cols = StructType([ StructField("Name",ArrayType(StringType()),True)  ])
df = spark.createDataFrame(data=data,schema=cols)
df.printSchema()
df.show()

output:
Name
["James","Jon","Jane"]
["Miken","Mik","Mike"]
["John","Johns"]

下面出现错误。对象(3)的长度与字段(1)的长度不匹配

mspsb9vt

mspsb9vt1#

该错误指示您试图从中创建DataFrame的数据中的元素数与架构中定义的列数不匹配。
在你的代码中,模式cols只有一个ArrayType(StringType())类型的字段“Name”,但是数据列表中的每一行都有3个元素。要解决这个错误,你需要修改模式以匹配数据,或者修改数据以匹配模式。
如果你想保持模式不变,你可以将数据更改为一个元组列表,其中每个元组只有一个元素,如下所示:

data = [ (["James","Jon","Jane"]), (["Miken","Mik","Mike"]), (["John","Johns"])]
cols = StructType([ StructField("Name",ArrayType(StringType()),True)  ])
df = spark.createDataFrame(data=[(row,) for row in data], schema=cols)
df.printSchema()
df.show()

这将创建一个DataFrame,其中一列“Name”包含字符串数组。

bybem2ql

bybem2ql2#

此错误是因为您以multiple-column structure的形式添加数据,而您的要求是单列数据值。
因此,要获取单列值中的数据,您需要[(row,) for row in data]

data = [(["James","Jon","Jane"]), (["Miken","Mik","Mike"]), (["John","Johns"])]
cols = StructType([ StructField("Name",ArrayType(StringType()),True)  ])
df = spark.createDataFrame(data=[(row,) for row in data], schema=cols)
df.printSchema()
df.show()

输出:

相关问题