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

如何在PySpark中解析嵌套XML并提取指定值到DataFrame列

解决Databricks中XML解析提取属性列表的问题

我来帮你搞定这个需求,咱们用Databricks的Spark XML解析器一步步实现把<c>元素的c属性值提取成列表并存入DataFrame的metadata列。

步骤1:确保XML解析库可用

Databricks通常已经预装了spark-xml库,如果没有的话,先在笔记本里运行安装命令:

%pip install spark-xml

步骤2:读取XML数据

首先把你的XML数据加载成DataFrame,注意指定根节点rowTag为"a",这样每个<a>标签会作为DataFrame的一行:

from pyspark.sql import SparkSession
from pyspark.sql.functions import expr, col

# 如果你的XML是文件形式,直接加载路径
df = spark.read.format("xml") \
    .option("rowTag", "a") \
    .load("/path/to/your/xml/file.xml")

# 要是用测试字符串的话,可以临时生成文件再加载(方便调试)
xml_test_data = """<a date="26-03-2018" id="1"> <text> </text> <metadata> <b> <c c="STRING1"> <d="value" e="string"/> </c> <c c="STRING2"> <d="value2" e="string" /> </c> </b> </metadata> </a>"""
spark.sparkContext.parallelize([xml_test_data]).saveAsTextFile("/tmp/test_xml")
df = spark.read.format("xml").option("rowTag", "a").load("/tmp/test_xml")

步骤3:提取属性值并生成列表

Spark XML会把元素的属性解析成以_开头的字段,比如<c c="STRING1">里的c属性会变成_c字段。我们可以用transform函数遍历<c>元素的数组,提取每个元素的_c值,组成列表替换原来的metadata列:

# 转换metadata列为属性值列表
result_df = df.withColumn("metadata", expr("transform(metadata.b.c, x -> x._c)"))

# 查看最终结果
result_df.show(truncate=False)

运行后你会得到这样的输出:

+-----------+---+----+----------------+
|date       |id |text|metadata        |
+-----------+---+----+----------------+
|26-03-2018|1  |    |[STRING1, STRING2]|
+-----------+---+----+----------------+

补充说明

如果你想保留原始的metadata结构,同时新增一个存列表的列,可以把withColumn里的metadata改成别的名字,比如c_values:

result_df = df.withColumn("c_values", expr("transform(metadata.b.c, x -> x._c)"))

这样就完美实现了你想要的效果啦!

内容的提问来源于stack exchange,提问作者user9226665

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:45:44