从apache doc on Distinct:Distinct<T> takes a PCollection<T> and returns a PCollection<T> that has all distinct elements of the input. Thus, each element is unique within each window.
还有,如果我没有记错,除非在Dataflow 2.5.0的批处理中另有指定,否则所有元素都是同一窗口的一部分。
这意味着线性管线中的Distinct
级将应用于所有元素。但是,我发现Distinct
之后的阶段可能已经在Distinct
阶段完成之前开始处理(=某些元素还没有通过)。而且,Distinct
阶段似乎只需要很少的计算能力(如在可视化console.cloud.google.com/dataflow/jobsDetail / ...上所示),这是意外的,因为在数以百万计的数据库中查找重复项输入对我来说似乎是一项后续任务。
所以我的问题如下:具有批处理功能的线性管道上的Distinct
阶段确实适用于批处理的所有元素吗?我遗漏了什么吗?
管道示例:
Pipeline p = Pipeline.create(options);
p.apply("Stuff", ParDo.of(new Stuff())
.apply(Distinct.<String>create())
.apply("OtherStuff", ParDo.of(new OtherStuff())
答案 0 :(得分:1)
是的,它适用于所有元素。基本上,不重复操作之后的阶段已经开始处理时没有问题。唯一操作仅需要抑制重复,但是可以处理元素的首次观察。
请查看implementation,以了解其内部工作原理,因为它基本上由一个简单的Combine.perKey
操作组成,而没有聚合任何值。