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

如何用PySpark从嵌套JSON的展开值创建DataFrame?

解决方案:将S3响应的嵌套JSON转换为PySpark DataFrame

方法一:直接使用createDataFrame(推荐)

由于response['Contents']本身是字典组成的列表,PySpark的createDataFrame可以直接处理这类Python对象,自动推断字段类型,无需额外JSON解析步骤,能避免_corrupt_record问题。

from pyspark.sql import SparkSession

# 初始化SparkSession(若未初始化)
spark = SparkSession.builder.appName("S3ContentsConverter").getOrCreate()

# 提取Contents数据,处理空列表的边界情况
contents_list = response.get("Contents", [])

# 直接创建DataFrame
object_df = spark.createDataFrame(contents_list)

# 查看结果
object_df.show(truncate=False)
# 查看Schema(验证字段类型)
object_df.printSchema()

执行后会得到与pandasjson_normalize一致的结果,其中LastModified字段会被自动识别为TimestampType。

方法二:通过JSON字符串解析(备选)

如果一定要用spark.read.json,需要将每个字典单独转换为JSON字符串,再传入Spark解析:

import json
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("S3ContentsConverter").getOrCreate()

# 将每个Contents元素转为JSON字符串
json_content = [json.dumps(item) for item in response.get("Contents", [])]

# 读取JSON字符串生成DataFrame
object_df = spark.read.json(spark.sparkContext.parallelize(json_content))

object_df.show(truncate=False)

为何之前的尝试失败?

你之前的代码将整个Contents列表作为单个元素传入parallelize,Spark会把这个列表当成单个JSON对象去解析,而列表本身不是合法的单个JSON对象,因此产生_corrupt_record错误。正确的做法是传入列表中的每个字典元素,或者直接用createDataFrame处理Python原生对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:18:29