Spark-XML嵌套父节点自定义Schema构建求助(Spark1.4.7/0.3.5)
解决Spark XML自定义嵌套Schema构建问题
嘿,刚上手spark-xml的时候,嵌套Schema的构建确实容易让人摸不着头脑,尤其是你用的Spark 1.4.7和spark-xml 0.3.5都是比较早期的版本,API细节和新版有区别,我来帮你理清楚~
从你给出的代码片段来看,你正在尝试构建包含嵌套结构的Schema(比如names字段是一个内部的StructType),下面我给出完整的正确实现示例,结合常见的XML结构场景:
假设你的目标XML结构大概是这样的:
<user> <id>1001</id> <name>Alice</name> <names> <first_name>Alice</first_name> <last_name>Johnson</last_name> </names> </user>
对应的自定义Schema构建代码(Test.java中):
import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.Metadata; import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; import org.apache.spark.sql.DataFrame; import org.apache.spark.sql.SQLContext; import org.apache.spark.SparkConf; import org.apache.spark.SparkContext; public class Test { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("SparkXMLTest").setMaster("local[*]"); SparkContext sc = new SparkContext(conf); SQLContext sqlContext = new SQLContext(sc); // 构建嵌套的names子Schema StructType namesSchema = new StructType(new StructField[]{ new StructField("first_name", DataTypes.StringType, true, Metadata.empty()), new StructField("last_name", DataTypes.StringType, true, Metadata.empty()) }); // 构建完整的自定义Schema StructType customSchema = new StructType(new StructField[]{ new StructField("id", DataTypes.StringType, true, Metadata.empty()), new StructField("name", DataTypes.StringType, true, Metadata.empty()), new StructField("names", namesSchema, true, Metadata.empty()) }); // 读取XML文件,注意指定rowTag为XML中的行标签(比如这里的<user>) DataFrame df = sqlContext.read() .format("com.databricks.spark.xml") .option("rowTag", "user") .schema(customSchema) .load("path/to/your/xml/file.xml"); // 验证结果 df.printSchema(); df.show(); } }
关键注意事项(针对你的版本):
- 嵌套Schema的构建:需要先单独定义内部的
StructType(比如示例中的namesSchema),再将其作为字段类型传入外层的StructField中,不要直接在createStructField里嵌套写,这样代码更清晰也不容易出错。 - spark-xml参数设置:必须通过
option("rowTag", "your-row-tag")指定XML中代表每条记录的标签,否则解析会不符合预期。 - 版本兼容性:Spark 1.4.7不支持新版的
StructTypeBuilder这类简化API,所以必须通过new StructType()和new StructField()的方式手动构建,Metadata.empty()在这个版本是可用的,用来填充元数据参数。
如果你的XML结构和示例不同,或者遇到了具体的报错(比如字段不匹配、解析失败),可以补充更多细节,我再帮你调整~
内容的提问来源于stack exchange,提问作者Punith Raj
相关产品推荐
相关产品推荐

