【问题标题】:Dataflow/ApacheBeam Limit input to the first X amount?数据流/ApacheBeam 限制输入到第一个 X 数量?
【发布时间】:2018-03-30 17:57:06
【问题描述】:

我有一个有限的 PCollection,但我只想获得前 X 数量的输入并丢弃其余的。有没有办法使用 Dataflow 2.X/ApacheBeam 做到这一点?

【问题讨论】:

  • 没有办法在 Apache Beam 中本地执行此操作。您可能能够以特定方式操作或查询输入源,以仅选择前 X 个元素。您从哪个输入源读取数据?
  • 最初的输入是来自 BigQuery 表的查询结果。然后它经过几个处理步骤和进一步过滤,然后到达我只需要前一百万的步骤。但是,我无法对查询进行限制。
  • 也许您可以使用Top 转换?

标签: java google-cloud-dataflow apache-beam


【解决方案1】:

正如@Andrew 在他的 cmets 中解释的那样,也许您可​​以在 Apache Beam 中使用Top 转换(对于JavaPython)。具体来说,Top.of() 函数返回一个带有 PCollectionPTransform,按比较器变换排序。

Here你可以找到一个简单的使用例子:

PCollection<Student> students = ...;
PCollection<List<Student>> top10Students = students.apply(Top.of(10, new CompareStudentsByAvgGrade()));

here 是另一个使用 Apache Beam Python SDK 的示例,它解决了 PCollection 中返回单个元素的事实。

【讨论】:

    【解决方案2】:

    对于 X 元素的随机样本,您可以使用内置的 Sample 变换(用于 PythonJava)。

    这是一个示例,展示了如何从 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')
    

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2016-01-13
      • 2014-02-18
      • 2016-09-26
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多