我正在处理一个窗口化的PubSub消息流,我想将它们存档到GCS。我希望已归档的文件具有从窗口时间戳派生的前缀(类似于gs://bucket/messages/2015/01/messages-2015-01-01.json)。这是可能的TextIO.Write,还是我需要实现自己的FileBasedSink?
答案 0 :(得分:2)
这可以通过TextIO
中最近添加的窗口写入功能来完成。请参阅documentation for TextIO,特别是withWindowedWrites
和to(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中的元素以时间戳输出。