当我处理一个大文件(超过500万行)时,看到的东西有些奇怪。在代码中,我的分片数量设置为1。但是,当我看到15个以上的文件被踢出时,我不确定为什么。谷歌搜索并没有给我任何东西来解释为什么发生这种情况。
作为摘要,下面是输出部分:
results.get(valid).setCoder(StringUtf8Coder.of()).apply("Build Window For Valid Entries", Window.<String>into(new GlobalWindows()).triggering(Repeatedly.forever(AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.ZERO))).withAllowedLateness(Duration.ZERO).discardingFiredPanes())
.apply("Write valid to GCS", TextIO.write().to(validFileLocation).withSuffix(".csv").withWindowedWrites().withNumShards(1));
有人有什么想法吗?
答案 0 :(得分:0)
如果您的输入是无限制的,那么您如何期望只写一个文件?
TextIO必须要么等待无界输入的末尾,要么使用开窗(边界数据)将其分片。
我不知道在GlobalWindow上触发的预期行为,也许只有最后一个文件包含所有数据?还是您达到了GCS的大小限制?
此外,GCS不允许修改文件,您只能添加或删除文件。
答案 1 :(得分:0)
我最终弄清楚了这一点。 GlobalWindows很好,但是要做我想做的最好方法是使用Session窗口。这样就解决了这个问题。
例如Sessions.withGapDuration(Duration.standardSeconds(10)))
这是说:“在收到最后一个数据包10秒钟后,如果我什么都没收到,请继续输出”