用 spark-xml 读取 XML 需先添加对应 Spark/Scala 版本的依赖,再通过 DataFrameReader 的 xml 方法加载,关键指定 rowTag 选项以标识记录节点,支持属性前缀、文本列名等解析控制,但不原生支持命名空间和非规则结构。

用 Apache Spark 的 spark-xml 包读取 XML 数据,核心是先添加依赖,再调用 DataFrameReader 的 xml 方法。它不是 Spark 内置格式,必须显式引入第三方包。
添加 spark-xml 依赖
根据你的 Spark 和 Scala 版本选择对应版本的 spark-xml。常见组合:
- Spark 3.5.x + Scala 2.12 →
com.databricks:spark-xml_2.12:0.17.0 - Spark 3.4.x + Scala 2.12 →
com.databricks:spark-xml_2.12:0.16.0 - Spark 3.3.x + Scala 2.12 →
com.databricks:spark-xml_2.12:0.15.0
启动 spark-shell 时用 --packages 参数加载:
或在 PySpark 中用 SparkSession.builder.config("spark.jars.packages", "...") 设置。
基础读取方式(Scala/Python)
XML 文件需有统一根节点和结构化子元素(如每条记录是 ),否则解析可能失败。
Scala 示例:
val df = spark.read.format("xml").option("rowTag", "book")
.load("books.xml")
Python(PySpark)示例:
df = spark.read.format("xml") \.option("rowTag", "book") \
.load("books.xml")
关键点:rowTag 指定每条记录对应的 XML 标签名(如 ),不设默认为 row;路径支持本地文件、HDFS、S3 等。
常用解析选项
XML 结构复杂时,靠这些选项控制解析行为:
-
attributePrefix:指定属性前缀(默认_),比如→ 列名_id -
valueTag:指定文本内容列名(默认value),用于处理这类纯文本标签Spark -
ignoreSurroundingSpaces:是否忽略标签内首尾空格(true更安全) -
excludeAttribute:设为true可跳过所有属性,只保留子元素 -
inferSchema:是否自动推断字段类型(true默认开启,但深层嵌套可能不准,可关掉后手动 cast)
处理嵌套与命名空间
带命名空间的 XML(如 )需先去掉前缀或预处理——spark-xml 原生不支持命名空间解析。
嵌套结构(如 )会自动转成嵌套字段:author.name。若想扁平化,可用 df.select("author.name") 或配合 explode 展开数组字段。
如果 XML 没有统一 rowTag(比如顶层是 ),建议先用 XSLT 或外部工具预处理,或改用 text 格式读入后用正则/UDF 解析——spark-xml 不适合解析非规则混合结构。
基本上就这些。不复杂但容易忽略 rowTag 和依赖版本匹配,跑通第一步后,后续清洗和转换就跟普通 DataFrame 一样操作。










