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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:52:52