You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark新手用StructType指定Schema创建DataFrame遇类型错误

PySpark指定Schema加载JSON报错解决方法

错误原因

spark.createDataFrame()的第一个参数要求是可迭代的行数据集合(比如列表、RDD等),你直接传入了单个字典对象jsn,Spark会将字典的键(如"books")当作独立元素处理,这和你定义的StructType Schema结构不匹配,因此抛出类型错误。

解决方案

方法1:将单个字典包装为列表

把你的字典放在列表中,让createDataFrame识别这是一行数据:

from pyspark.sql.types import StructType, StructField, ArrayType, StringType, IntegerType

jsn = {"books": [{"book_id": "B001","book_name": "The Great Gatsby","author": "F. Scott Fitzgerald","copies_available": 5},{"book_id": "B002","book_name": "To Kill a Mockingbird","author": "Harper Lee","copies_available": 3}]}

js_schema = StructType([
    StructField("books",ArrayType(StructType([
        StructField("book_id",StringType()),
        StructField("book_name",StringType()),
        StructField("author",StringType()),
        StructField("copies_available",IntegerType())
    ])))
])

# 用列表包裹字典,作为行数据传入
df = spark.createDataFrame([jsn], js_schema)
df.show(truncate=False)

运行后会输出正确的DataFrame:

+------------------------------------------------------------------------------------------------------------------------------------+
|books                                                                                                                               |
+------------------------------------------------------------------------------------------------------------------------------------+
|[{B001, The Great Gatsby, F. Scott Fitzgerald, 5}, {B002, To Kill a Mockingbird, Harper Lee, 3}]|
+------------------------------------------------------------------------------------------------------------------------------------+

方法2:使用Spark JSON读取器(推荐)

如果你的JSON数据来自字符串或文件,更推荐用spark.read.schema()方法加载,这是PySpark处理JSON数据的标准方式:

from pyspark.sql.types import StructType, StructField, ArrayType, StringType, IntegerType

js_schema = StructType([
    StructField("books",ArrayType(StructType([
        StructField("book_id",StringType()),
        StructField("book_name",StringType()),
        StructField("author",StringType()),
        StructField("copies_available",IntegerType())
    ])))
])

# 从JSON字符串加载
json_str = """{"books": [{"book_id": "B001","book_name": "The Great Gatsby","author": "F. Scott Fitzgerald","copies_available": 5},{"book_id": "B002","book_name": "To Kill a Mockingbird","author": "Harper Lee","copies_available": 3}]}"""
df = spark.read.schema(js_schema).json(sc.parallelize([json_str]))

# 若从文件加载,替换为文件路径
# df = spark.read.schema(js_schema).json("/path/to/your/json/file.json")

df.printSchema()
df.show(truncate=False)

这种方式无需手动处理行数据结构,Spark会自动按照指定Schema解析JSON内容。

内容的提问来源于stack exchange,提问作者rohith reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:17:26