Google cloud dataflow 不使用运行时参数的数据流模板

Google cloud dataflow 不使用运行时参数的数据流模板,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在使用数据流模板来运行云数据流 我提供一些默认值并调用模板。数据流在数据流管道摘要中正确显示管道选项。但它不接受运行时值 class Mypipeoptions(PipelineOptions): @classmethod def _add_argparse_args(cls, parser): parser.add_value_provider_argument( '--preprocess_indir', h

我正在使用数据流模板来运行云数据流

我提供一些默认值并调用模板。数据流在数据流管道摘要中正确显示管道选项。但它不接受运行时值

class Mypipeoptions(PipelineOptions):
    @classmethod
    def _add_argparse_args(cls, parser):
        parser.add_value_provider_argument(
            '--preprocess_indir',
            help='GCS path of the data to be preprocessed',
            required=False,
            default='gs://default/dataset/'
        )
        parser.add_value_provider_argument(
            '--output_dir_train',
            help='GCS path of the preprocessed train data',
            required=False,
            default='gs://default/train/'
        )
        parser.add_value_provider_argument(
            '--output_dir_test',
            help='GCS path of the preprocessed test data',
            required=False,
            default='gs://default/test/'
        )
        parser.add_value_provider_argument(
            '--output_dir_validate',
            help='GCS path of the preprocessed validate data',
            required=False,
            default='gs://default/validate/'
        )
然后我检查值是否可访问

p = beam.Pipeline(options=args)

    if args.preprocess_indir.is_accessible():
        input_dir = args.preprocess_indir
    else:
        input_dir = getValObj(args.preprocess_indir)


    if args.output_dir_train.is_accessible():
        output_train = args.output_dir_train
    else:
        output_train = getValObj(args.output_dir_train)

    if args.output_dir_test.is_accessible():
        output_test = args.output_dir_test
    else:
        output_test = getValObj(args.output_dir_test)

    if args.output_dir_validate.is_accessible():
        output_validate = args.output_dir_validate
    else:
        output_validate = getValObj(args.output_dir_validate)

现在,当调用模板时,我可以看到我希望作为(Mypipeoptions)pipeine option parmater传递的值,但它没有在实际运行中使用,而是使用给定的默认选项。我想我找到了解决方案,我将运行时参数分配给变量,然后将其传递给输入或输出

当我直接将运行时参数传递给source或sink时,它工作了。像下面这个

 'Write train dataset to destination' >> beam.io.tfrecordio.WriteToTFRecord(
        file_path_prefix=args.output_dir_train
    ) 
我相信我遗漏的部分是,当创建模板时,它会构建图形,并且只有运行时参数可以插入到其运行时。在构建图形时,其他计算已经完成


如果我错了,请纠正我

您将选项传递给哪些不使用运行时值的转换?无,如图所示,这些选项用于text.io read和tfrecord.io sink。您能否更新部分问题以包括如何在管道中定义转换?您的回答正确。您需要将值提供程序对象传递到使用它们的转换中,以便在运行时读取它们时,它们可以从PipeineOptions获取。您好@user3483651,很抱歉打扰大家,我也面临类似的问题(对于RuntimeValueProvider),但无法绕过。当你有时间的时候,请你检查一下。以下是链接: