在全球范围内,其想法是读取一个实木复合地板文件(返回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中的一个(没有规则是哪个)。 我试图在平整收藏集后进行一些打印,并且打印看起来不错,而且我也尝试将这些数据写入.txt格式,而且效果也很好。
此外,我尝试了一种愚蠢的解决方案,但令我惊讶的是,它以某种方式通过了。 oldGen参数的一列带有布尔标志。我已将该pcollection转换为两个集合,一个集合的标志为true,另一个集合的标志为false。
PCollectionList的片段如下:
PCollectionList<GenericRecord> pList = PCollectionList.of(newGen).and(trueGen).and(falseGen);
镶木地板的外观与上一片段相同,但是有了此片段,我得到了一个很好的镶木地板文件,其中包含所有必要的记录。
这看起来真的很奇怪,因为在这两种情况下,当我放平那些PCollection时都得到了相同的PCollection,而当我在DirectRunner上运行它时又得到了一件事情,一切正常,没有任何问题。
Beam版本为2.14.0,Spark版本为2.2.3。
有人知道为什么在第一种情况下会发生这种情况吗?