Pyspark如何将JSON数组格式字符串列explode拆分为多行数据
Pyspark解析JSON数组列并拆分为多行的实现方法
你原有代码出错的核心原因是con列存储的是JSON数组字符串,但你定义的schema是单个结构体类型,和实际数据结构不匹配,导致from_json解析失败。
正确实现逻辑如下:
- 第一步:将schema定义为数组嵌套结构体的格式,匹配JSON数组的结构
- 第二步:用
from_json将con列的字符串解析为Spark数组类型 - 第三步:用
explode函数将数组元素拆分为多行,保留原行的name、type列 - 第四步:提取结构体中的count、sum字段作为独立列
完整可运行代码:
from pyspark.sql.functions import from_json, col, explode from pyspark.sql.types import StructType, StructField, StringType, ArrayType # 定义匹配JSON数组的schema,外层是ArrayType,内层对应数组内每个JSON对象的结构 json_schema = ArrayType( StructType([ StructField("count", StringType(), True), StructField("sum", StringType(), True) ]) ) result_df = df.withColumn("con_arr", from_json(col("con"), json_schema)) \ # 解析JSON字符串为数组类型 .withColumn("con_item", explode(col("con_arr"))) \ # 把数组每个元素拆为单独行 .select( "name", "type", col("con_item.count").alias("count"), # 提取结构体字段为独立列 col("con_item.sum").alias("sum") ) # 验证输出 result_df.show(truncate=False)
如果需要保留con列为空、空数组的原始行,可以把explode替换为explode_outer,对应行的count和sum会自动填充为null。
内容的提问来源于stack exchange,提问作者Jerr567
相关产品推荐
相关产品推荐

