繁体   English   中英

在 apache 梁管道 Python 中跳过步骤

[英]Skipping step in an apache beam pipeline Python

所以我正在构建一个 apache 光束管道,并且在跳过 python ZF20E8800B5C6800AAD896F888B2A62AFCZ 中的步骤时遇到了一些麻烦。 这是一个我遇到问题的简化示例:

import apache_beam as beam
import os 

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = API_KEY
def foo(message):
    pass

options = {
    'streaming': True
}

runner = 'DirectRunner'
opts = beam.pipeline.PipelineOptions(flags=[], **options)
with beam.Pipeline(runner, options=opts) as p:
    sub_message = (p | 'sub' >> beam.io.ReadFromPubSub(subscription=my_sub))
    result = (sub_message | 'foo' >> beam.Map(foo))
    result | 'print' >> beam.Map(print)

    job = p.run()
    if runner == 'DirectRunner':
        job.wait_until_finish()

So according to this: Apache Beam - skip pipeline step which is in Java if my function doesn't return anything then apache_beam should skip the rest of the steps. 如果我错了,请纠正我,但在 python 中,这与返回 None 相同,因此我的pass可以替换为return None并且完全相同。 但是,当我使用passreturn None运行此代码时,结果确实会进入下一步。 也就是说,当它不应该打印任何内容时,它会继续打印None ,因为它应该跳过所有后续步骤。 任何帮助表示赞赏。

有趣的是,一旦我发布了这个,我就在文档中找到了答案。 所以看起来在我提供的链接中,我提供的等效项是像我一样使用 ParDo 而不是 map。 所以真的应该是这样的:

import apache_beam as beam
import os 

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credentials
class TestFn(beam.DoFn):
    def process(self, element):
        print('hi')
        pass

options = {
    'streaming': True
}

runner = 'DirectRunner'
opts = beam.pipeline.PipelineOptions(flags=[], **options)
with beam.Pipeline(runner, options=opts) as p:
    sub_message = (p | 'sub' >> beam.io.ReadFromPubSub(subscription=mysub))
    result = (sub_message | 'foo' >> beam.ParDo(TestFn()))
    result | 'print' >> beam.Map(print)

    job = p.run()
    if runner == 'DirectRunner':
        job.wait_until_finish()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM