检查 PCollection 是否为空 - Apache Beam

Check if PCollection is empty - Apache Beam

有什么方法可以检查 PCollection 是否为空?

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

您没有指定您使用的是哪个 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

如果不对其应用 PTransform(例如 Count.globally() 或 Combine.combineFn()),就无法检查 PCollection 的大小,因为 PCollection 不像 [ 中的典型集合=19=] SDK左右。

它是有界或无界数据集合的抽象,其中数据被馈送到集合中以用于对其应用的操作(例如 PTransform)。它还是并行化的(如 class 开头的 P 建议的那样)。

因此,您需要一种机制来从每个 worker/node 中获取元素的数量,并将它们组合起来以获得一个值。直到那个转换结束才能知道它是0还是n。