检查PCollection是否为空--Apache Beam

时间:2017-10-11 11:34:58

标签: google-cloud-dataflow apache-beam

有没有办法检查PCollection是否为空?

我没有在Dataflow和Apache Beam的文档中找到任何相关内容。

2 个答案:

答案 0 :(得分:1)

您没有指定您正在使用的SDK,因此我假设使用了Python。代码很容易移植到Java。

您可以应用元素的全局计数,然后通过应用简单比较将数值映射到布尔值。您可以使用pvalue.AsSingleton函数侧输入此值,如下所示:

import apache_beam as beam
from apache_beam import pvalue

is_empty_check = (your_pcollection
                    | "Count" >> beam.combiners.Count.Globally()
                    | "Is empty?" >> beam.Map(lambda n: n == 0)
                    )

another_pipeline_branch = (
    p
    | beam.Map(do_something, is_empty=pvalue.AsSingleton(is_empty_check))
)

侧输入的用法如下:

def do_something(element, is_empty):
    if is_empty:
        # yes
    else:
        # no

答案 1 :(得分:1)

如果没有在其上应用PTransform(例如Count.globally()或Combine.combineFn()),则无法检查PCollection的大小,因为PCollection不像Java SDK中的典型Collection那样。

它是有界或无界数据集合的抽象,其中数据被馈送到集合中以对其应用的操作(例如PTransform)。它也是并行化的(正如班级开头的P所示)。

因此,您需要一种机制来获取每个工作者/节点的元素计数,并将它们组合起来以获取值。无论是0还是n,在转换结束之前都无法知道。