如何在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
相关产品推荐
相关产品推荐

