我有一个有限的 PCollection,但我只想获得第一个 X 数量的输入并丢弃其余的。有没有办法使用 Dataflow 2.X/ApacheBeam 来做到这一点?
正如@Andrew 在他的评论中所解释的那样,也许您可以在 Apache Beam 中使用
Top
转换(对于 Java 或 Python)。具体来说,Top.of()
函数返回一个带有 PCollection 的 PTransform,由比较器变换排序。
在这里你可以找到一个简单的使用示例:
PCollection<Student> students = ...;
PCollection<List<Student>> top10Students = students.apply(Top.of(10, new CompareStudentsByAvgGrade()));
和here另一个使用Apache Beam Python SDK的示例,它解决了在PCollection中返回单个元素的事实。
对于 X 元素的随机样本,您可以使用内置的样本转换(对于 Python 或 Java)。
这里是一个示例,展示了如何从 100 个元素的示例输入中采样 10 个元素:
import apache_beam as beam
from apache_beam.transforms.combiners import Sample
with beam.Pipeline(runner='DirectRunner') as p:
input = p | beam.Create(range(100))
output = input | Sample.FixedSizeGlobally(10)
output | beam.io.WriteToText('output')
如果您不关心顺序,只想要 N 个项目的样本,那么我认为您应该可以使用
beam.combiners.Sample.FixedSizeGlobally
,如下所述:https://beam.apache.org/documentation/transforms/ python/聚合/样本/