Python 2.7 如何将参数传递到数据流模板以进行管道构造

Python 2.7 如何将参数传递到数据流模板以进行管道构造,python-2.7,google-cloud-datastore,google-cloud-dataflow,Python 2.7,Google Cloud Datastore,Google Cloud Dataflow,我正在尝试这样做一个祖先查询,并将其转换为模板版本。 问题在于,参数祖先_id用于管道构造期间的函数make_query。 如果在创建和暂存模板时未传递它,我将获取RuntimeValueProviderError:RuntimeValueProvider(选项:祖先id,类型:int)。get()未从运行时上下文调用。但是,如果我在创建模板时传递它,它看起来就像一个StaticValueProvider,在我执行模板时永远不会更改。 管道施工中,向模板传递参数的正确方法是什么 import a

我正在尝试这样做一个祖先查询,并将其转换为模板版本。

问题在于,参数祖先_id用于管道构造期间的函数make_query。 如果在创建和暂存模板时未传递它,我将获取RuntimeValueProviderError:RuntimeValueProvider(选项:祖先id,类型:int)。get()未从运行时上下文调用。但是,如果我在创建模板时传递它,它看起来就像一个StaticValueProvider,在我执行模板时永远不会更改。

管道施工中,向模板传递参数的正确方法是什么

import apache_beam as beam
from apache_beam.io.gcp.datastore.v1.datastoreio import ReadFromDatastore
from apache_beam.options.pipeline_options import PipelineOptions
from google.cloud.proto.datastore.v1 import entity_pb2
from google.cloud.proto.datastore.v1 import query_pb2
from googledatastore import helper as datastore_helper
from googledatastore import PropertyFilter

class Test(PipelineOptions):
  @classmethod
  def _add_argparse_args(cls, parser):
    parser.add_value_provider_argument('--ancestor_id', type=int)

def make_query(ancestor_id):
    ancestor = entity_pb2.Key()
    datastore_helper.add_key_path(ancestor, KIND, ancestor_id)
    query = query_pb2.Query()
    datastore_helper.set_kind(query, KIND)
    datastore_helper.set_property_filter(query.filter, '__key__', PropertyFilter.HAS_ANCESTOR, ancestor)
    return query

pipeline_options = PipelineOptions()
test_options = pipeline_options.view_as(TestOptions)
with beam.Pipeline(options=pipline_options) as p:
  entities = p | ReadFromDatastore(PROJECT_ID, make_query(test_options.ancestor_id.get()))
两个问题

  • ValueProvider.value.get()
    方法只能在运行时方法中运行,如
    ParDo.process()
    。看

  • 此外,您的挑战是您正在使用Google云数据存储IO(来自数据存储的查询)。截至今日(2018年5月), 表示数据存储IO尚未接受运行时模板参数

  • 尤其是python

    以下连接器接受运行时参数。 基于文件的IOs:textio、avroio、tfrecordio


    解决方法
    :您可能首先可以在不使用任何模板参数的情况下运行查询,以获取实体的PCollection。此时,由于任何转换器都可以接受模板参数,因此您可以将其用作过滤器。但这取决于您的用例,它可能不适用于您

    这是否意味着我需要获取所有表,然后对其进行过滤?这是我可以想到的另一种选择。也许还有其他可能的解决办法。如果您可以使用编译时输入参数(不是运行时),这不是问题。但我想你们在运行时确实需要它,对吗?似乎模板只能使用运行时参数,所以我的解决方法是不使用模板。。。