python-2.7 - 如何将参数传递给数据流模板以进行管道构建
问题描述
我正在尝试像这个示例一样进行祖先查询并将其转移到模板版本。
问题是参数祖先ID是在管道构建期间用于函数make_query的。如果我在创建和暂存模板时不传递它,我会得到RuntimeValueProviderError: RuntimeValueProvider(option:ancest_id, type: int).get() not called from a runtime context。但是如果我在创建模板时传递它,它似乎是一个在我执行模板时永远不会改变的 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 Cloud Datastore IO(来自数据存储的查询)。截至今天(2018 年 5 月),官方文档表明,Datastore IO尚不接受运行时模板参数。
对于python,特别是,
以下连接器接受运行时参数。基于文件的 IO:textio、avroio、tfrecordio
一种解决方法:您可能可以首先运行没有任何模板化参数的查询来获取实体的 PCollection。此时,由于任何转换器都可以接受模板化参数,因此您可以将其用作过滤器。但这取决于您的用例,可能不适用于您。
推荐阅读
- python - AttributeError:“BoxLayout”对象没有属性,文本输入
- javascript - Office.js | 如何从工作簿中读取隐藏的工作表数据
- api - EWS 托管 API:会话不是复制项目上的 IMailboxSession
- python - 从乳房 X 光检查图像中去除字母伪影
- python - 如何将列表转换为 numpy.datetime64 格式
- javascript - 如何运行基于变量值的函数,该变量值依赖于规范茉莉花中的其他函数?
- c# - 如何在 C# vs 项目中创建清单以限制 AxInterop.MSTSCLib 的 mstscax.dll 搜索路径?
- python - 错误答案测试用例跳过 Google 启动 Round E 2020 最长算术
- html - 按钮中的“NoReverseMatch”指的是在 url 中有参数的页面
- angular - 用于 PDFJS 元数据提取的 Angular Observable