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

Spark Scala 从DataFrame列提取XML并保留关联id字段的实现问询

问题1解答

如果你的text列存储的XML片段本身已包含唯一顶层根节点,拼接根节点的步骤可以省略,只需将后续解析的rootTag参数改为原始根节点名称即可。如果text是多个平级<row>组成的无顶层根节点的片段,该步骤是必要的,因为XML语法标准要求必须有且仅有一个根节点,否则解析器会抛出格式错误。


核心问题解决方案

你原来的方案中使用spark.read.xml属于批读取API,会把输入的字符串列当成独立的XML内容批量加载,丢失了和原表id字段的行级关联关系。改用行级XML解析函数from_xml即可保留原行所有字段,完整实现代码如下:

import org.apache.spark.sql.functions._
import com.databricks.spark.xml.functions.from_xml
import com.databricks.spark.xml.schema_of_xml

// 1. 给无根节点的XML片段拼接根节点(如果不需要可跳过)
val dfWithRoot = df.withColumn("text_with_root", concat(lit("<root>"), $"text", lit("</root>")))

// 2. 推导XML结构 schema
val payloadSchema = schema_of_xml(dfWithRoot.select("text_with_root").as[String])

// 3. 行级解析XML,保留原id字段
val parsedDf = dfWithRoot.withColumn(
  "parsed", 
  from_xml(
    col = $"text_with_root", 
    schema = payloadSchema, 
    options = Map("rootTag" -> "root", "rowTag" -> "row")
  )
)

// 4. 展开array、提取目标字段
val resultDf = parsedDf
  .withColumn("row_item", explode($"parsed.row"))
  .select(
    $"id",
    $"row_item.key".alias("key"),
    $"row_item.value".alias("value")
  )

执行后resultDf的结构完全符合你的预期:

root
 |-- id: decimal(38,0) (nullable = true)
 |-- key: string (nullable = true)
 |-- value: string (nullable = true)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:09