PySpark构造包含数组字段的DataFrame格式与预期不符如何修正
问题排查与解决方法
错误原因
- 数据维度错误:你定义的
array_str1、array_str2、names每个元素都额外多套了一层列表,比如[["Size", "Color"]],导致数组字段多了一层嵌套,才会出现[[Size, Color]]的双层数组结构。 - 行列顺序颠倒:
spark.createDataFrame传入的第一个参数是行的集合,你现在把三个整列的数据当作三行传入,导致每一行都对应了一整列的内容,和预期结构完全不符。 - Schema字段顺序和预期不符:你期望输出的第一列是
str1,但你定义的Schema里前两个字段是数组类型,最后一个才是str1,顺序对应错误。
修正后的代码
from pyspark.sql.types import StructType, StructField, ArrayType, StringType # 调整Schema字段顺序,和预期输出的字段顺序、字段名一致 schema = StructType([ StructField("str1", StringType(), False), StructField("array_of_str1", ArrayType(StringType()), False), StructField("array_of_str2", ArrayType(StringType()), False) ]) # 去掉每个元素外层多余的列表括号,避免两层嵌套 array_str1 = ["Size", "Color"], ["Size", "Color"], ["Size", "Color"] array_str2 = ["M", "Black"], ["L", "White"], ["M", "Red"] names = "John", "Tom", "Matteo" # 按行构造数据,每一行对应三个字段的取值 row_data = list(zip(names, array_str1, array_str2)) df = spark.createDataFrame(row_data, schema) df.show(10,False)
运行输出
运行上述代码后即可得到你预期的结果:
+------+-------------+-------------+ |str1 |array_of_str1|array_of_str2| +------+-------------+-------------+ |John |[Size, Color]|[M, Black] | |Tom |[Size, Color]|[L, White] | |Matteo|[Size, Color]|[M, Red] | +------+-------------+-------------+
内容的提问来源于stack exchange,提问作者practicalGuy
相关产品推荐
相关产品推荐

