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()
。看解决方法:您可能首先可以在不使用任何模板参数的情况下运行查询,以获取实体的PCollection。此时,由于任何转换器都可以接受模板参数,因此您可以将其用作过滤器。但这取决于您的用例,它可能不适用于您 这是否意味着我需要获取所有表,然后对其进行过滤?这是我可以想到的另一种选择。也许还有其他可能的解决办法。如果您可以使用编译时输入参数(不是运行时),这不是问题。但我想你们在运行时确实需要它,对吗?似乎模板只能使用运行时参数,所以我的解决方法是不使用模板。。。