【问题标题】:Dataflow Write to File in Order of PCollection数据流按 PCollection 的顺序写入文件
【发布时间】:2017-06-01 08:21:56
【问题描述】:

我有一个 PCollection 持有 KV 并且只有一个键值,键没有意义,值持有 KV 的 Iterable。这个内部 KV 的 key 是一个数字,这个 KV 的 value 是一个字符串的 Iterable。 PCollection 的定义如下:

PCollection<KV<String, Iterable<KV<Long, Iterable<String>>>>>

我想在一台机器上写入文件:按数字排序,对于每个数字和该数字中的每个字符串,文件中的一行。

使用这个 PCollection 我可以有一个 ParDo,它在它的 processElement 方法中接收所有数字及其字符串。 现在我可以按数字排序,迭代数字,为每个数字迭代字符串并将字符串和数字输出到输出集合。

但是,当我将此集合写入这样的文件时:

outputCollection.apply(TextIO.Write.withoutSharding().to(options.getOutputFilePath()));

字符串不是按数字排序写入的,看起来写入是并行完成的,即使它是在单台机器上本地完成的。 尽管我将“数字:字符串”插入到按数字排序的输出集合中,但在文件中我看到数字混淆了。

如何控制 TextIO.Write 写入记录的顺序?我可以告诉它在单线程中运行并使用元素插入 PCollection 的顺序吗?

谢谢

【问题讨论】:

标签: google-cloud-dataflow


【解决方案1】:

PCollection 中的元素是无序的。这与 PCollection 中的所有元素都可能在不同的机器上处理这一事实密切相关,并且机器之间的排序会很困难。

如果您知道特定键的所有数据都适合一台机器,则可以输出包含所有值的单个元素,然后创建一个自定义接收器,将其写入文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多