Итак, я пытаюсь сгенерировать 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)
, потому что у меня огромный набор данных, и один работник не сможет его обработать.