有没有办法检查PCollection是否为空?
我没有在Dataflow和Apache Beam的文档中找到任何相关内容。
答案 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,在转换结束之前都无法知道。