如何在PySpark中用spark-xml正确读取嵌套XML并展平属性列?
嵌套XML转扁平DataFrame的缺失步骤
你当前的代码缺少对嵌套categories列的扁平化处理步骤,需要在Spark DataFrame阶段完成结构展开,再转为Pandas DataFrame。具体实现及关键步骤如下:
完整代码实现
from pyspark.sql import SparkSession from pyspark.sql import functions as F spark = SparkSession.builder.appName("Nested XML to DataFrame").getOrCreate() # 读取XML文件 df = spark.read.format("com.databricks.spark.xml")\ .option("rootTag", "document") \ .option("rowTag", "documentnode")\ .load("test.xml") # 1. 展开categories数组(XML重复节点会被解析为数组类型) exploded_df = df.withColumn("category", F.explode(F.col("categories"))) # 2. 提取属性name和对应VALUE值,生成键值对 key_value_df = exploded_df.select( # 保留原DataFrame中除categories外的所有列 *[col for col in df.columns if col != "categories"], F.col("category._name").alias("attr_name"), # XML属性会自动添加下划线前缀 F.col("category.VALUE").alias("attr_value") ) # 3. 透视转换:将属性名转为列名,VALUE作为对应列的值 flattened_df = key_value_df.groupBy( # 按原DataFrame的非categories列分组(保证每行数据的唯一性) *[col for col in df.columns if col != "categories"] ).pivot("attr_name").agg(F.first("attr_value")) # 若同一属性有多值,可替换为F.collect_list等聚合函数 # 转为Pandas DataFrame ss_pandas_df = flattened_df.toPandas() print(ss_pandas_df.head(1))
核心步骤说明
- 数组展开:用
F.explode把categories数组拆分为独立行,每个category元素单独对应一行数据。 - 键值提取:从每个category节点中取出
_name(XML属性的默认命名规则)和VALUE字段,作为后续转列的基础键值对。 - 透视转列:通过
groupBy+pivot组合,将属性名直接转为DataFrame的列名,并用聚合函数提取对应的值,实现结构扁平化。
内容的提问来源于stack exchange,提问作者ahkam
相关产品推荐
相关产品推荐

