Java 将两个通用记录平铺为一个,并将其写入拼花文件

Java 将两个通用记录平铺为一个,并将其写入拼花文件,java,apache-beam,Java,Apache Beam,在global中,我们的想法是读取一个拼花地板文件(返回PCollection),根据已读取的文件创建新的PCollection,将这两个PCollection合并为一个,并将其写入其他位置的拼花地板文件 我正在SparkRunner上尝试此代码 我不能发布完整的代码,但我会尝试指出逻辑 这是一段代码片段: PCollection<GenericRecord> oldGen = pipeline.apply(ParquetIO.read(SCHEMA).from(/path); PC

在global中,我们的想法是读取一个拼花地板文件(返回PCollection),根据已读取的文件创建新的PCollection,将这两个PCollection合并为一个,并将其写入其他位置的拼花地板文件

我正在SparkRunner上尝试此代码

我不能发布完整的代码,但我会尝试指出逻辑

这是一段代码片段:

PCollection<GenericRecord> oldGen = pipeline.apply(ParquetIO.read(SCHEMA).from(/path);
PCollection<GenericRecord> newGen = processNew(); //in this part I am making new PCollection
PCollectionList<GenericRecord> pList = PCollectionList.of(oldGen).and(newGen);

pList
     .apply(Flatten.pCollections())
     .setCoder(AvroCoder.of(GenericRecord.class, SCHEMA))
     .apply(FileIO.<GenericRecord>write()
         .via(ParquetIO.sink(SCHEMA)).to(/outputlocation));
PCollection oldGen=pipeline.apply(ParquetIO.read(SCHEMA.from)(/path);
PCollection newGen=processNew();//在这一部分中,我将创建新的PCollection
PCollectionList pList=PCollectionList.of(oldGen.)和(newGen);
普利斯特
.apply(展平.pCollections())
.setCoder(AvroCoder.of(genericord.class,SCHEMA))
.apply(FileIO.write()
.via(ParquetIO.sink(SCHEMA)).to(/outputlocation));
当我检查输出位置时,我只得到这两个位置中应该展平的一个PCollection(没有规则是哪一个)。 我试着在整理完收藏后进行一些打印,打印效果很好,我还试着将这些数据写入.txt格式,效果也很好

此外,我尝试了一个愚蠢的解决方案,令我惊讶的是,它不知怎么通过了。 oldGen参数有一列带有布尔标志。我已将该pcollection转换为两个集合,一个带有标志true,另一个带有标志false

PCollectionList的代码段如下所示:

PCollectionList<GenericRecord> pList = PCollectionList.of(newGen).and(trueGen).and(falseGen);
PCollectionList pList=PCollectionList.of(newGen).和(trueGen).和(falseGen);
写入拼花看起来与前面的代码片段相同,但是通过这个代码片段,我得到了一个很好的拼花文件,其中包含了所有必要的记录

这看起来真的很奇怪,因为在这两种情况下,当我平放这些PCollection时,我得到了相同的PCollection,还有一件事,当我在DirectRunner上运行它时,一切正常,没有任何问题

Beam版本为2.14.0,Spark版本为2.2.3


有人知道为什么在第一种情况下会发生这种情况吗?

我同意,非常奇怪!只是确认一下——在给定的示例中,所有的
genericord
实例都有相同的
SCHEMA
?你能给我们提供Beam版本和Spark版本吗?@RyanSkraba是的,这是相同的SCHEMA。我刚刚用versi更新了这个问题Beam和Spark的ons。@RyanSkraba此版本的Spark与此版本的Beam不兼容,因此需要对拼花地板和avro依赖项进行着色。这可能是此问题的根源吗?很好@IvanMilasevic!有一些关于在运行ParquetIO和旧版本的Spark的文档。您使用此技术吗?我不确定s是相关的,因为“布尔标志”如果是着色问题,简化示例也应该失败!@RyanSkraba是的,我们正在使用该技术。Maven包含您在该链接上作为答案发布的代码片段。在使用该链接中的代码片段后,我们对拼花地板格式没有任何问题,除了这一个。我同意,非常奇怪!只是确认一下——在给定的示例中所有的
genericord
实例都有相同的
SCHEMA
?你能给我们提供Beam版本和Spark版本吗?@RyanSkraba是的,它是相同的SCHEMA。我刚刚用Beam和Spark版本更新了这个问题。@RyanSkraba这个版本的Spark与这个版本的Beam不兼容,所以拼花地板和avro不兼容需要着色。这可能是这个问题的根源吗?好的观点@IvanMilasevic!有一些关于运行ParquetIO和Spark at的旧版本的文档。你使用这种技术吗?我不确定这是否相关,因为“布尔标志”如果是着色问题,简化示例也应该失败!@RyanSkraba是的,我们正在使用该技术。Maven包含您在该链接上作为答案发布的代码片段。在使用该链接中的代码片段后,我们对拼花地板格式没有任何问题,除了这一个。