在Google Cloud Dataflow中访问模板化的运行时参数-Python

时间:2018-07-10 16:05:27

标签: python-2.7 google-cloud-platform google-bigquery google-cloud-dataflow apache-beam

我正在尝试为Google Cloud Dataflow创建自己的模板,以便可以从GUI执行作业,从而使其他人更容易执行。我已按照这些教程进行操作,创建了自己的PipelineOptions类,并使用parser.add_value_provider_argument()方法进行了填充。然后,当我尝试使用my_options.argname.get()将这些参数传递到管道中时,出现一个错误,告诉我未从运行时上下文中调用该项目。我不明白arg不是定义管道图本身的一部分,它们只是诸如输入文件名,输出表名等参数。

下面是代码。如果我对输入的文件名,输出表名,写入Disposition和定界符进行硬编码,则它可以工作。如果我用等效的my_options.argname.get()替换它们,它将失败。在所示的代码段中,我已经对所有输出进行了硬编码,除了outputBQTable名称,我在其中使用了my_options.outputBQTable.get()。失败,并显示以下消息。

apache_beam.error.RuntimeValueProviderError:RuntimeValueProvider(选项:outputBQTable,类型:str,default_value:'dataflow_csv_reader_testing.names')。get()未从运行时上下文中调用

我感谢任何有关如何使其正常工作的指导。

import apache_beam
from apache_beam.io.gcp.gcsio import GcsIO
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.value_provider import RuntimeValueProvider
import csv
import argparse

class MyOptions(PipelineOptions):
    @classmethod
    def _add_argparse_args(cls,parser):
        parser.add_value_provider_argument('--inputGCS', type=str,
              default='gs://mybucket/df-python-csv-test/test-dict.csv',
              help='Input gcs csv file, full path and filename')
        parser.add_value_provider_argument('--delimiter', type=str,
              default=',',
              help='Character used as delimiter in csv file, default is ,')
        parser.add_value_provider_argument('--outputBQTable', type=str,
              default='dataflow_csv_reader_testing.names',
              help='Output BQ Dataset.Table to write to')
        parser.add_value_provider_argument('--writeDisposition', type=str,
              default='WRITE_APPEND',
              help='BQ write disposition, WRITE_TRUNCATE or WRITE_APPEND or WRITE_EMPTY')

def main():
    optlist=PipelineOptions()
    my_options=optlist.view_as(MyOptions)
    p = apache_beam.Pipeline(options=optlist)
    (p
    | 'create'            >> apache_beam.Create(['gs://mybucket/df-python-csv-test/test-dict.csv'])
    | 'read gcs csv dict' >> apache_beam.FlatMap(lambda file: csv.DictReader(apache_beam.io.gcp.gcsio.GcsIO().open(file,'r'), delimiter='|'))
    | 'write bq record'   >> apache_beam.io.Write(apache_beam.io.BigQuerySink(my_options.outputBQTable.get(), write_disposition='WRITE_TRUNCATE'))
    )
    p.run()

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:1)

指定管道时,不能使用my_options.outputBQTable.get()。 BigQuery接收器已经知道如何使用运行时提供的参数,因此我认为您可以传递my_options.outputBQTable

根据我从文档中收集的信息,在传递给options.runtime_argument.get()步骤的process的{​​{1}}方法中,应该只使用DoFn

注意:我使用2.8.0的Apache Beam SDK进行了测试,因此我使用ParDo而不是WriteToBigQuery

答案 1 :(得分:0)

这是尚未为Python SDK开发的功能。

相关的open issue可以在Apache Beam项目页面上找到。

在解决上述问题之前,目前的解决方法是使用Java SDK。