Spark-Xml Root Tag генерируется в каждом файле детали - PullRequest
0 голосов
/ 26 апреля 2018

Итак, я пытаюсь сгенерировать 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");

Когда я запускаю это, он создает два файла part-00000 и part-00001 в указанном каталоге. В каждом файле есть тег Root and 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>

Как можно избежать дублирования этого RootTag в каждом файле детали?

Я не хочу использовать repartition(1), потому что у меня огромный набор данных, и один работник не сможет его обработать.

...