首页 > 解决方案 > apache_beam.io.WriteToText() 文件名作为模板参数

问题描述

我在 DataFlow 上执行了一个 apache_beam 模板。我需要将要写入的文件的名称作为模板参数传递。就像是

gcloud dataflow jobs run JOB_NAME \
    --gcs-location gs://YOUR_BUCKET_NAME/templates/MyTemplate \
    --parameters output_file_name=OUTPUT_NAME , input_file_name=INPUT_NAME 

的值output_file可以通过 PipelineOptions 访问,例如

class MyOptions(PipelineOptions):
@classmethod
def _add_argparse_args(cls,parser):
    parser.add_value_provider_argument('--output_file_name', type=str,
          help='Output Name')
    parser.add_value_provider_argument('--input_file_name', type=str,
          help='Input Name')
    

如果我需要output_name在这样的apache_beam.io.WriteToText东西中使用

   optlist=PipelineOptions()
    my_options=optlist.view_as(MyOptions)
    p = apache_beam.Pipeline(options=optlist)
    (p
    | 'create'            >> apache_beam.Create(["1","2","3"])
    | beam.io.WriteToText(my_options.output_file_name.get())

    )
    p.run()

这是不允许的,因为我们my_options.output_name.get()只能作为运行时值读取,如果我们尝试将此代码部署为模板,则会引发错误。

考虑到这是一个非常常见的用例,我认为可能有一个通用的库或解决方案。有人有工作吗?

标签: python-3.xgoogle-cloud-dataflowapache-beam

解决方案


您可以将Flex 模板用于此类情况。在从模板创建管道时,它们对哪些参数可以变化没有任何限制。


推荐阅读