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

PySpark中XML数据按行Explode拆分失败,求解决方案

正确拆分XML中重复标签的PySpark实现

问题根源

你之前的方案失败原因如下:

  • 第一种方法的XPath路径错误:未定位到<Allocation>节点,而是指向了<Rob>,导致xpath_array仅能获取单个<Rob>节点,无法生成多个<Allocation>的数组。
  • 第二种方法使用xpath_string只能提取指定路径的文本内容,不具备生成数组并拆分多行的能力。

正确实现方案

通过xpath_array精准定位所有<Allocation>节点生成数组,再用explode展开为多行,最后提取各层级节点的属性:

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

# 1. 提取所有<Allocation>节点组成的数组并展开为多行
exploded_df = df.withColumn(
    "allocation_node",
    explode(expr("xpath_array(formData, '/FormValues/FieldValues/FieldValue/Robs/Rob/Allocation')"))
)

# 2. 提取各层级XML属性,保留原DataFrame字段
result_df = exploded_df.select(
    # 保留原DataFrame的业务字段
    col("firstname"),
    col("lastname"),
    col("gender"),
    # 提取<Robs>节点的AsOfDate属性
    expr("xpath_string(formData, '/FormValues/FieldValues/FieldValue/Robs/@AsOfDate')").alias("as_of_date"),
    # 提取<Rob>节点的属性
    expr("xpath_string(formData, '/FormValues/FieldValues/FieldValue/Robs/Rob/@col1')").alias("rob_col1"),
    expr("xpath_string(formData, '/FormValues/FieldValues/FieldValue/Robs/Rob/@col2')").alias("rob_col2"),
    expr("xpath_string(formData, '/FormValues/FieldValues/FieldValue/Robs/Rob/@Remaining')").alias("rob_remaining"),
    # 提取当前行对应的<Allocation>节点属性
    expr("xpath_string(allocation_node, './@Name')").alias("allocation_name"),
    expr("xpath_string(allocation_node, './@Quantity')").alias("allocation_quantity")
)

# 查看拆分后的结果
result_df.show(truncate=False)

关键说明

  • xpath_array('/FormValues/FieldValues/FieldValue/Robs/Rob/Allocation'):精准定位所有<Allocation>节点,生成包含多个节点的数组。
  • explode:将数组中的每个<Allocation>节点拆分为单独一行。
  • 提取上层节点(如<Robs>、<Rob>)属性时,仍使用原formData列的XPath,确保每行都能关联到相同的上层属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:03:22