运行数据流模板作业时的 RuntimeValueProviderError

问题描述

试图弄清楚为什么我会收到这些错误快速搜索只会找到提到损坏版本的答案,但这里似乎并非如此。创建模板工作正常,但是当我运行它时(并通过限制参数),我收到以下错误。这个想法是基于模板中提供的参数来构建查询。如果有更好的替代方法,我愿意接受。

代码

class Options(PipelineOptions):
    @classmethod
    def _add_argparse_args(cls,parser):
        parser.add_value_provider_argument(
            '--limit',default=0,type=int,help='Limit the amount of rows retrieved'
        )

...
    
def from_bq(options):
    with beam.Pipeline(options=options) as p:
        (p 
            | 'Read From BQ' >> beam.io.ReadFromBigQuery(query=nestedValueProvider(options.limit,create_query),use_standard_sql=True)
        ) 
    
def create_query(limit):
    query = """
        SELECT * FROM ...
    """

    if limit > 0:
        query = query + " LIMIT {limit}".format(limit=limit)

    return query

错误

raise error.RuntimeValueProviderError('%s not accessible' % obj)
apache_beam.error.RuntimeValueProviderError: nestedValueProvider(value: RuntimeValueProvider(option: limit,type: int,default_value: 0),translator: create_query) not accessible [while running 'Read From BQ/Read/Split-ptransform-324']

运行 apache-beam 版本 2.27.0。

解决方法

我认为标准模板不可能做到这一点。您应该考虑使用 Flex Templates,它具有非模板管道的全部灵活性。