如何用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
相关产品推荐
相关产品推荐

