TextIO可以写入从窗口maxTimestamp派生的前缀吗?

时间:2015-11-04 12:38:41

标签: google-cloud-dataflow

我正在处理一个窗口化的PubSub消息流,我想将它们存档到GCS。我希望已归档的文件具有从窗口时间戳派生的前缀(类似于gs://bucket/messages/2015/01/messages-2015-01-01.json)。这是可能的TextIO.Write,还是我需要实现自己的FileBasedSink?

4 个答案:

答案 0 :(得分:2)

这可以通过TextIO中最近添加的窗口写入功能来完成。请参阅documentation for TextIO,特别是withWindowedWritesto(FilenamePolicy)。此功能也出现在AvroIO

答案 1 :(得分:1)

您只是在寻找功能TextIO.Write.Bound<String>.withSuffix()TextIO.Write.Bound<String>.to()吗?看来这些将允许您为输出文件名提供后缀或前缀。

答案 2 :(得分:0)

现在,TextIO.Write不支持以流模式运行 - 写入GCS很棘手,例如,因为您无法从多个工作程序同时写入文件,并且一旦关闭就无法附加到文件。我们计划为TextIO添加流媒体支持。

今天使用BigQuery而不是GCS,你将得到最好的支持 - 因为我们已经在流媒体中支持BigQuery写入,你根据窗口名称选择你写的表,BigQuery支持来自许多不同工作者的写入马上。

答案 3 :(得分:-2)

TextIO.Write应该可行。无需自定义文件链接。

在您的情况下,您希望将PubSub消息写入输出文本文件 - 不是在本地,而是在远程GS上。你应该可以使用:  PCollection .apply.TextIO.Write()。to(

由于您正在处理PubSub消息流,因此您的窗口是无界的,您的PubSub数据源已经为PCollection中的每个元素提供了时间戳。

如果要分配时间戳,ParDo转换需要使用使用ProcessContext.outputWithTimestamp()输出元素的DoFn。

总之,您可以使用TextIO.Write aftre确保PCollection中的元素以时间戳输出。