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

