Spark-xml无法提取rowTag外的rootTag元素问题求助
解决Spark XML提取rootTag下rowTag外字段的问题
问题原因
当指定rowTag为book时,spark-xml会将每个book元素直接解析为DataFrame的行数据,而根节点catalog下的dt_creation属于父级元素,不会被自动包含到每行的字段中,因此查询该字段会抛出解析异常。
解决方案
通过先读取整个根节点,再拆分子节点并关联父级字段的方式实现:
代码示例
// 读取整个catalog节点,不指定rowTag val rawDf = sparkSession.read .format("xml") .option("rootTag", "catalog") .load("path/to/your/xml/file") // 将book数组展开为多行,同时保留dt_creation字段 val resultDf = rawDf.select($"dt_creation", explode($"book").alias("book")) .select($"dt_creation", $"book.*") // 验证dt_creation字段 resultDf.select("dt_creation").show()
代码说明
- 第一步读取整个
catalog节点,此时DataFrame包含两个字段:dt_creation(字符串类型)和book(数组类型,每个元素是对应book的结构)。 - 使用
explode函数将book数组拆分为多行,每一行对应一个book元素,同时保留dt_creation字段。 - 最后通过
select($"dt_creation", $"book.*")将book的内部字段展开,得到包含dt_creation和所有book字段的DataFrame。
替代写法(自动识别根节点)
如果XML文件只有一个根节点,也可以省略rootTag参数:
val rawDf = sparkSession.read .format("xml") .load("path/to/your/xml/file") val resultDf = rawDf.select($"dt_creation", explode($"book").alias("book")) .select($"dt_creation", $"book.*")
内容的提问来源于stack exchange,提问作者jOasis
相关产品推荐
相关产品推荐

