如何在PySpark中读取XML格式的嵌套元素
PySpark读取XML嵌套层级元素方案
要在PySpark中解析XML的嵌套元素,需要使用Databricks开源的spark-xml工具包,具体操作步骤如下:
参考示例结构:
前置依赖
启动PySpark前需要引入对应版本的spark-xml依赖,Spark 3.x版本通用依赖引用方式如下:
- 交互式启动时追加参数:
pyspark --packages com.databricks:spark-xml_2.12:0.16.0 - 代码中内置依赖配置:可直接在SparkSession初始化时加入config配置
1. 初始化Spark会话
from pyspark.sql import SparkSession from pyspark.sql.functions import col, explode spark = SparkSession.builder \ .appName("NestedXMLParse") \ .config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.16.0") \ .getOrCreate()
2. 读取XML文件并生成DataFrame
首先确定你要解析的行级节点标签(即你需要把XML中哪个标签下的内容作为DataFrame的一行),假设行级标签为item,读取代码如下:
df = spark.read \ .format("com.databricks.spark.xml") \ .option("rowTag", "item") # 替换为实际的行节点标签 .load("你的XML文件路径.xml")
读取完成后可执行df.printSchema()查看自动解析的嵌套结构,确认各字段的层级路径。
3. 提取嵌套层级字段
嵌套结构为对象(StructType)
直接用.运算符即可访问子层级字段,例如要提取root.user.info.address字段:
result_df = df.select( col("id").alias("id"), col("user.info.address").alias("user_address") ) result_df.show()
嵌套结构为数组(ArrayType)
需要先调用explode函数把数组展开为多行,再提取子字段,例如要提取root.user.order[].order_id字段:
# 展开order数组 exploded_df = df.withColumn("order_item", explode(col("user.order"))) # 提取数组内的子字段 result_df = exploded_df.select( col("id").alias("id"), col("order_item.order_id").alias("order_id") ) result_df.show()
多层嵌套场景
多层嵌套的数组需要逐层展开,再提取目标字段,例如要提取root.user.order[].goods[].goods_name字段:
# 第一层展开order数组 step1_df = df.withColumn("order", explode(col("user.order"))) # 第二层展开goods数组 step2_df = step1_df.withColumn("goods", explode(col("order.goods"))) # 提取目标字段 result_df = step2_df.select( col("id").alias("id"), col("goods.goods_name").alias("goods_name") ) result_df.show()
常用可选配置
| 配置项 | 作用 |
|---|---|
option("ignoreNamespace", True) | 忽略XML中的命名空间,避免命名空间导致字段解析失败 |
option("attributePrefix", "_") | 把XML标签的属性统一加上前缀,避免和子标签重名冲突 |
option("rowValidationXSDPath", "xxx.xsd") | 传入XSD schema文件校验XML格式合法性 |
内容的提问来源于stack exchange,提问作者Venkatesh
相关产品推荐
相关产品推荐

