我有一个PCollection,它持有KV并且只有一个键值,该键没有任何意义,该值包含一个可转换的KV。这个内部KV的关键是一个数字,这个KV的值是一个Iterable of Strings。 PCollection的定义如下:
PCollection<KV<String, Iterable<KV<Long, Iterable<String>>>>>
我想写一台机器上的文件:按数字排序,每个数字和该数字中的每个字符串,文件中的一行。
使用此PCollection我可以使用ParDo在其processElement方法中接收所有数字及其字符串。 现在我可以按数字排序,迭代数字,每个数字迭代字符串并输出字符串和数字到输出集合。
但是,当我将此集合写入这样的文件时:
outputCollection.apply(TextIO.Write.withoutSharding().to(options.getOutputFilePath()));
字符串不是按编号排序的,似乎写入是并行完成的,即使它是在一台机器上本地完成的。 即使我将“number:string”插入到根据数字排序的输出集合中,但在文件中我看到数字混合了。
如何控制TextIO.Write写入记录的顺序?我可以告诉它在单个线程中运行并使用元素插入PCollection的顺序吗?
感谢
答案 0 :(得分:1)
PCollection中的元素是无序的。这与PCollection中的所有元素可能在不同的机器上处理,并且机器之间的排序很困难这一事实密切相关。
如果您知道特定键的所有数据都适合一台计算机,则可以输出包含所有值的单个元素,然后创建一个将其写入文件的自定义接收器。