spark-xml 中具有嵌套父节点的自定义模式
Posted
技术标签:
【中文标题】spark-xml 中具有嵌套父节点的自定义模式【英文标题】:Custom schema with nested parent node in spark-xml 【发布时间】:2018-03-27 18:24:28 【问题描述】:我对 spark-xml 很陌生,我发现为我的对象准备自定义架构很困难。请求大家帮助我。以下是我尝试过的。
我使用的是 Spark 1.4.7 和 spark-xml 版本 0.3.5
Test.Java
StructType customSchema = new StructType(new StructField[]
new StructField("id", DataTypes.StringType, true, Metadata.empty()),
new StructField("name", DataTypes.StringType, true, Metadata.empty()),
DataTypes.createStructField("names", DataTypes.createStructType(new StructField[]
DataTypes.createStructField("test", DataTypes.createArrayType(DataTypes.StringType),
true)), true)
);
final JavaRDD<Row> map = spoofRDD()
.map(book -> RowFactory.create(
book.getId(),
book.getName(),
book.getNames()));
final DataFrame df = sqlContext.createDataFrame(map, customSchema);
df.show();
df.printSchema();
private JavaRDD<Book> spoofRDD()
Book book1 = Book.builder().id("1").name("Name1")
.names(new String[]"1", "2").build();
List<Book> books = new ArrayList<>();
books.add(book1);
return javaSparkContext.parallelize(books);
我的 POJO 类 Book.Java
private final String id;
private final String name;
private final String[] names;
我的预期 XML
<books>
<book>
<id>1</id>
<name>Name1</name>
**<parent>**
<names>1</names>
<names>2</names>
**</parent>**
</book>
<book>
<id>2</id>
<name>Name2</name>
**<parent>**
<names>1</names>
<names>2</names>
**</parent>**
</book>
所以,如您所见,我希望在父级中有一个嵌套标签。如何修改我的 customSchema 以实现相同的效果。
【问题讨论】:
【参考方案1】:所需 XML 输出的正确架构是:
root
|-- id: long (nullable = true)
|-- name: string (nullable = true)
|-- parent: struct (nullable = true)
| |-- names: array (nullable = true)
| | |-- element: long (containsNull = true)]
而您当前的架构是:
root
|-- id: string (nullable = true)
|-- name: string (nullable = true)
|-- names: struct (nullable = true)
| |-- test: array (nullable = true)
| | |-- element: string (containsNull = true)
因此,您唯一需要在此处更改的标记名称从 test
到 name
和 names
到 parent
以及数组内容的值类型。
new StructType(new StructField[]
new StructField("id", DataTypes.StringType, true, Metadata.empty()),
new StructField("name", DataTypes.StringType, true, Metadata.empty()),
DataTypes.createStructField("names", DataTypes.createStructType(new StructField[]
DataTypes.createStructField("test", DataTypes.createArrayType(DataTypes.StringType),
true)), true)
)
真正的问题是数据。因为parent
必须是struct
,所以getNames
输出应该用Row
包装:
.map(book -> RowFactory.create(
book.getId(),
book.getName(),
RowFactory.create(book.getNames())));
【讨论】:
以上是关于spark-xml 中具有嵌套父节点的自定义模式的主要内容,如果未能解决你的问题,请参考以下文章
为具有嵌套标签的自定义标签编写 jekyll 插件时出现问题
嵌套的自定义 FormArray 组件不与具有 FormArrayName 的子表单绑定