Spark-Xml Root Tag在每个零件文件中生成

时间:2018-04-26 12:00:40

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

所以我试图生成一个结构不足的XML。

<n:Brands>
    <n:Brand>
        <Name>234</Name>
        <Test>34</Test>
    </n:Brand>
    <n:Brand>
        <Name>234</Name>
        <Test>34</Test>
    </n:Brand>
</n:Brands>

现在我有以下代码

public static void main(String[] args) {
SparkConf sparkConf = new SparkConf();
sparkConf.setAppName("Unit Test");
sparkConf.setMaster("local[2]");
JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
SQLContext sqlContext = new SQLContext(javaSparkContext);

final JavaRDD<Book> parallelize = javaSparkContext
    .parallelize(Arrays.asList(Book.builder().name("234").test("34").build(),
        Book.builder().name("234").test("34").build()));

final JavaRDD<Row> map = parallelize.map(book -> RowFactory.create(
    book.getName(),
    book.getTest()
));

final Dataset<Row> dataFrame = sqlContext.createDataFrame(map, new StructType(new StructField[]{
    new StructField("Name", DataTypes.StringType, true, Metadata.empty()),
    new StructField("Test", DataTypes.StringType, true, Metadata.empty())
}));

dataFrame
    .write()
    .format("com.databricks.spark.xml")
    .mode(SaveMode.Overwrite)
    .option("rootTag", "n:Brands")
    .option("rowTag", "n:Brand")
    .save("out/path");

当我运行它时,它会在指定目录中创建一个两部分00000和部分00001文件。每个文件都有一个Root和Row标记。 当我复制部分文件时,它会复制RootTag(n:Brands)。

每个零件文件如下所示。

<n:Brands>
    <n:Brand>
        <Name>234</Name>
        <Test>34</Test>
    </n:Brand>
</n:Brands>

我使用FileUtil来合并partFile。

FileUtil.copyMerge(hdfs, new org.apache.hadoop.fs.Path(processLocation), hdfs,
          new org.apache.hadoop.fs.Path(preparedLocation), false,
          getFSConfiguration(), null);

当我合并两个部分文件时,它就变成了。

<n:Brands>
    <n:Brand>
        <Name>234</Name>
        <Test>34</Test>
    </n:Brand>
</n:Brands>
<n:Brands>
    <n:Brand>
        <Name>234</Name>
        <Test>34</Test>
    </n:Brand>
</n:Brands>

如何避免在每个Part文件中重复使用此RootTag?

我不想使用repartition(1),因为我有一个庞大的数据集,单个工作人员将无法处理它。

0 个答案:

没有答案