Google cloud dataflow 如何尽快限制Apache Beam中的PCollection?

Google cloud dataflow 如何尽快限制Apache Beam中的PCollection?,google-cloud-dataflow,apache-beam,spotify-scio,Google Cloud Dataflow,Apache Beam,Spotify Scio,我正在谷歌云数据流上使用ApacheBeam2.28.0(带有Scio SDK)。我有一个大的输入PCollection(有界),我想将其限制/采样到固定数量的元素,但我想尽快开始下游处理 当前,当我的输入PCollection包含例如2000万个元素时,我希望使用 input.apply(Sample.any(1000000)) 它会一直等到所有的2000万个元素都被读取,这需要很长时间 如何有效地将元素数量限制为固定大小,并在达到限制后立即开始下游处理,放弃其余的输入处理?好的,因此我的初

我正在谷歌云数据流上使用ApacheBeam2.28.0(带有Scio SDK)。我有一个大的输入
PCollection
(有界),我想将其限制/采样到固定数量的元素,但我想尽快开始下游处理

当前,当我的输入
PCollection
包含例如2000万个元素时,我希望使用

input.apply(Sample.any(1000000))
它会一直等到所有的2000万个元素都被读取,这需要很长时间


如何有效地将元素数量限制为固定大小,并在达到限制后立即开始下游处理,放弃其余的输入处理?

好的,因此我的初始解决方案是使用有状态DoFn,如下所示(我使用的是问题中提到的Scio的Scala SDK):

import java.lang.{Long=>JLong}
类MyLimitFn[T](限制:长)扩展DoFn[KV[字符串,T],KV[字符串,T]]{
@StateId(“count”)private val count=StateSpecs.value[JLong]()
@过程元素
def processElement(上下文:DoFn[KV[String,T],KV[String,T]]#ProcessContext,@StateId(“count”)count:ValueState[JLong]):单位={
val current=count.read()
if(电流<限值){
计数写入(当前+1L)
context.output(context.element())
}
}
}
此解决方案的缺点是,在使用之前,我需要向所有元素综合添加相同的键(例如空字符串)。到目前为止,它比Sample.any()快得多


我仍然期待看到更好/更有效的解决方案。

我将确认这可能是适用于您的用例的最佳方法。最初的实现效率较低,因为它不使用有状态处理,而是被迫使用CombineFn。这也是它要求在输出数据之前接收所有元素的原因:融合阶段结束,以便可以为联合收割机聚合元素,并在要求所有数据都存在的批处理管道中。
input.apply(Sample.<String>any(1000000))