数据流管道运行完毕后,是否可以在GCS中移动文件?如果是这样,怎么样?应该是最后一个.apply
?我无法想象是这样的。
这里的情况是我们从客户端导入了很多.csv。我们需要无限期保留这些CSV,因此我们要么“将CSV标记为已经处理”,要么将它们移出TextIO
用于查找csv的初始文件夹。我目前唯一能想到的就是在BigQuery中存储文件名(我不知道我是如何得到这个,我是DF新手),然后排除已经从执行中存储的文件管道莫名其妙?但必须有一个更好的方法。
这可能吗?我该怎么办?
感谢您的帮助!
答案 0 :(得分:4)
您可以尝试使用BlockingDataflowPipelineRunner
并在p.run()
之后在主程序中运行任意逻辑(它将等待管道完成)。
请参阅Specifying Execution Parameters,特别是"阻止执行"。
但是,一般情况下,您似乎确实需要一个持续运行的管道,该管道使用CSV文件监视目录并在出现时导入新文件,从不导入相同的文件两次。对于流式传输管道来说,这将是一个很好的例子:您可以编写一个自定义UnboundedSource(另请参阅Custom Sources and Sinks)来查看目录并在其中返回文件名(即T
可能是String
或GcsPath
):
p.apply(Read.from(new DirectoryWatcherSource(directory)))
.apply(ParDo.of(new ReadCSVFileByName()))
.apply(the rest of your pipeline)
其中DirectoryWatcherSource
是您的UnboundedSource
,ReadCSVFileByName
也是您需要编写的转换文件路径,并将其作为CSV文件读取,返回其中的记录(遗憾的是,您现在无法在管道中间使用TextIO.Read
等转换,只能在开头使用 - 我们正在努力修复此问题。)
这可能有点棘手,正如我所说,我们在工作中有一些功能使其更简单,我们正在考虑创建这样的内置源,但它可能是现在,这仍然比弹球作业更容易"。如果有任何不清楚的地方,请试试dataflow-feedback@google.com
告诉我们!
与此同时,您还可以存储有关您在Cloud Bigtable处理或尚未处理的文件的信息 - 它比BigQuery更适合这些文件,因为它更多适用于随机写入和查找,而BigQuery更适合在整个数据集上进行大量批量写入和查询。