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

Spark Scala提取DataFrame列中XML标签转为多列求助

解决Spark DataFrame中XML字符串解析并提取指定字段的问题

原代码存在的问题

  • Schema定义错误:
    • XML中<FD>是单个结构体而非数组,但原Schema将其定义为ArrayType,导致解析后无法正确提取字段。
    • 根节点应为<variable>而非直接<AL>,原Schema跳过了根节点,导致解析不完整。
    • <item>是<AL>下的数组,但原Schema的嵌套层级逻辑有误,未正确对应XML的层级结构。
  • 无效配置:spark.conf.set("spark.xml.rowTag","parsed")是用于spark-xml库读取XML文件时指定行标签的配置,对from_xml函数无效,属于多余操作。
  • 遗漏字段:未处理<AN>字段,该字段与<FD>同级,位于<item>节点下。

正确实现步骤

  1. 定义匹配XML结构的正确Schema
  2. 使用from_xml解析colD中的XML字符串
  3. 展开嵌套的数组结构(<AL>下的<item>数组)
  4. 提取所有需要的字段,并保留原DataFrame的colA、colB、colC

完整代码示例

import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

// 1. 定义匹配XML结构的Schema
val xmlSchema = new StructType()
  .add("DD", StringType) // 若不需要可删除
  .add("SDI", StringType) // 若不需要可删除
  .add("AL", new StructType()
    .add("item", ArrayType(new StructType()
      .add("AN", StringType)
      .add("FD", new StructType()
        .add("SOF", StringType)
        .add("LEN", StringType)
        .add("BN", StringType)
        .add("COC", StringType)
        .add("LA", StringType)
        .add("ST", StringType)
        .add("CT", StringType)
        .add("ZN", StringType)
        .add("TI", StringType)
        .add("PN", StringType)
        .add("PF", StringType)
        .add("PB", StringType)
      )
    ))
  )

// 2. 解析XML字符串并展开item数组
val parsedDF = inputdf
  .withColumn("parsed_xml", from_xml(col("colD"), xmlSchema))
  .select(
    col("colA"), col("colB"), col("colC"), // 保留原字段
    explode_outer(col("parsed_xml.AL.item")).alias("item_data") // 展开item数组,兼容空数组场景
  )

// 3. 提取所有需要的字段
val finalDF = parsedDF
  .select(
    col("colA"), col("colB"), col("colC"),
    col("item_data.AN"),
    col("item_data.FD.SOF"),
    col("item_data.FD.LEN"),
    col("item_data.FD.BN"),
    col("item_data.FD.COC"),
    col("item_data.FD.LA"),
    col("item_data.FD.ST"),
    col("item_data.FD.CT"),
    col("item_data.FD.ZN"),
    col("item_data.FD.TI"),
    col("item_data.FD.PN"),
    col("item_data.FD.PF"),
    col("item_data.FD.PB")
  )

// 查看结果
finalDF.show()

代码说明

  • Schema定义:严格对应XML的层级结构,<FD>定义为StructType而非数组,<item>定义为ArrayType以兼容XML中多个item的场景。
  • 展开数组:使用explode_outer展开<item>数组,确保即使没有item也不会丢失原行数据。
  • 字段提取:直接从展开后的item_data中提取AN和FD下的所有目标字段,同时保留原DataFrame的colA、colB、colC。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:43:21