Spark-Xml:Dataframe中Array中的数组,用于生成XML

时间:2018-04-24 17:40:08

标签: apache-spark apache-spark-sql spark-dataframe apache-spark-dataset apache-spark-xml

我需要生成具有以下结构的XML

<parent>
	<name>parent</name
    <childs>
	<child>
		<name>child1</name>
	</child>
	<child>
		<name>child1</name>
        <grandchilds>
		<grandchild>
			<name>grand1</name>
		</grandchild>
		<grandchild>
			<name>grand2</name>
		</grandchild>
		<grandchild>
			<name>grand3</name>
		</grandchild>
      </grandchilds>
	</child>
	<child>
		<name>child1</name>
	</child>
  </childs>
</parent>	

如您所见,父母将有孩子,而子节点可能有孙子节点。

https://github.com/databricks/spark-xml#conversion-from-dataframe-to-xml

我从spark-xml了解到,当我们有一个嵌套的数组结构时,数据框应该如下所示

+------------------------------------+
|                                   a|
+------------------------------------+
|[WrappedArray(aa), WrappedArray(bb)]|
+------------------------------------+

有关如何为我想要的xml制作扁平DataFrame的小例子,请帮助我。我正在开发Spark 2.X Spark-Xml 0.4.5(最新版)

我的架构

StructType categoryMapSchema = new StructType(new StructField[]{
          new StructField("name", DataTypes.StringType, true, Metadata.empty()),
          new StructField("childs", new StructType(new StructField[]{
              new StructField("child",
                  DataTypes.createArrayType(new StructType(new StructField[]{
                      new StructField("name", DataTypes.StringType, true,          Metadata.empty()),
                      new StructField("grandchilds", new StructType(new StructField[]{
                          new StructField("grandchild",
                              DataTypes.createArrayType(new StructType(new StructField[]{
                                  new StructField("name", DataTypes.StringType, true,
                                      Metadata.empty())
                              })), true, Metadata.empty())
                      }), true, Metadata.empty())
                  })), true, Metadata.empty())
          }), true, Metadata.empty()),
      });

My Row RDD数据..不是实际代码,但有点像这样。

final JavaRDD<Row> rowRdd = mapAttributes
      .map(parent -> {
        return RowFactory.create(
        parent.getParentName(),
        RowFactory.create(RowFactory.create((Object) parent.getChild))
        );

      });

到目前为止,我已经尝试过WrappedArray在父WrappedArray中无效。

0 个答案:

没有答案