Dataflow模板是否支持BigQuery接收器选项的模板输入?

时间:2017-11-06 10:33:34

标签: python google-cloud-dataflow apache-beam

由于我正在运行静态Dataflow,我想从这个创建一个模板,让我轻松地重用Dataflow而无需任何命令行输入。

在官方的Creating Templates教程之后,没有提供可模拟输出的示例。

我的数据流以BigQuery接收器结束,它接受一些参数,如目标表存储。这个确切的参数是我想在我的模板中提供的参数,允许我在运行流程后选择目标存储。

但是,我无法让这个工作。下面我粘贴一些代码片段,这有助于解释我的确切问题。

class CustomOptions(PipelineOptions):
    @classmethod
    def _add_argparse_args(cls, parser):
        parser.add_value_provider_argument(
            '--input',
            default='gs://my-source-bucket/file.json')
        parser.add_value_provider_argument(
            '--table',
            default='my-project-id:some-dataset.some-table')

pipeline_options = PipelineOptions()

pipe = beam.Pipeline(options=pipeline_options)

custom_options = pipeline_options.view_as(CustomOptions)

(...)

# store
processed_pipe | beam.io.Write(BigQuerySink(
    table=custom_options.table.get(),
    schema='a_column:STRING,b_column:STRING,etc_column:STRING',
    create_disposition=BigQueryDisposition.CREATE_IF_NEEDED,
    write_disposition=BigQueryDisposition.WRITE_APPEND
))

创建模板时,我没有给出任何参数。在一瞬间,我收到以下错误消息:

apache_beam.error.RuntimeValueProviderError: RuntimeValueProvider(option: table, type: str, default_value: 'my-project-id:some-dataset.some-table').get() not called from a runtime context

当我在创建模板时添加--table参数时,正在创建模板,但--table参数值随后在模板中被硬编码,并且不被{{1}的任何给定模板值覆盖以后。

当我用table替换table=custom_options.table.get(),时,我收到同样的错误。

是否有人使用可自定义的BigQuerySink参数构建了可模拟的数据流?我很想得到一些暗示。

1 个答案:

答案 0 :(得分:1)

Python目前仅支持FileBasedSource IO的ValueProvider选项。您可以通过单击您提到的链接上的Python选项卡来查看: https://cloud.google.com/dataflow/docs/templates/creating-templates

在“管道I / O和运行时参数”部分下。

与Java中发生的情况不同,Python中的BigQuery不使用自定义源。换句话说,它没有在SDK中完全实现,但也包含后端的部分(因此它是“本地源”)。只有自定义源可以使用模板。有计划将BigQuery添加为自定义源:issues.apache.org/jira/browse/BEAM-1440