Java 数据流上的Apache Beam不接受BigQuery的ValueProvider 目标

Java 数据流上的Apache Beam不接受BigQuery的ValueProvider 目标,java,google-cloud-platform,google-bigquery,apache-beam,Java,Google Cloud Platform,Google Bigquery,Apache Beam,我的目标是创建一个指定ApacheBeam管道的数据流模板。管道以批处理模式运行,从BigQuery读取数据,然后在别处执行转换和写入。最重要的是,我用于读取BigQuery的查询必须在运行时提供 预期行为 预期结果是管道将使用运行时参数指定BigQuery查询,执行查询,然后继续管道的其余部分 实际行为 实际行为是忽略我传入的运行时参数,而是使用创建GCS模板时必须指定的参数 相关代码 下面是我如何指定读取操作,以及如何定义和传入查询参数 public interface MyOptions

我的目标是创建一个指定ApacheBeam管道的数据流模板。管道以批处理模式运行,从BigQuery读取数据,然后在别处执行转换和写入。最重要的是,我用于读取BigQuery的查询必须在运行时提供

预期行为 预期结果是管道将使用运行时参数指定BigQuery查询,执行查询,然后继续管道的其余部分

实际行为 实际行为是忽略我传入的运行时参数,而是使用创建GCS模板时必须指定的参数

相关代码 下面是我如何指定读取操作,以及如何定义和传入查询参数

public interface MyOptions extends PipelineOptions, StreamingOptions {
    @Description("Query String")
    ValueProvider<String> getQueryString();

    void setQueryString(ValueProvider<String> value);
}

public static void main(String[] args) {
        MyOptions options = PipelineOptionsFactory.fromArgs(args)
                .withValidation()
                .as(MyOptions.class);
        Pipeline p = Pipeline.create(options);

        PCollection<TableRow> tableRows =
                p.apply(BigQueryIO.readTableRows()
                        .fromQuery(options.getQueryString())
                        .withTemplateCompatibility()
                        .withoutValidation());
// Add this point I run my transformations and loading
}
最后,我使用DataflowWebUI从GCS中选择模板并进行部署。在Web UI的底部,我指定了我的运行时参数,在这里我设置了queryString和我想要使用的运行时查询


注意:当我在数据流中运行模板时,我指定queryString,并且我知道它正在传入。我重写了第一次转换以打印queryString,它正确地打印了指定的运行时选项。问题是“从BigQuery读取”查询字符串仍然是我制作模板时使用的原始字符串。

经过多次迭代,我解决了这个问题。实际上有2个,最大的一个是我不需要将运行时参数传递到“构建模板”步骤中

  • 构建管道时不要传递运行时参数。这似乎很明显,但是从
    mvn编译参数中删除它
  • 将queryString格式化为运行时参数很困难。在多次迭代之后,下面的代码对我有效
  • 请注意,整个参数周围缺少引号,以及projectId.dataset.tableId的格式

    mvn compile -Pdataflow-runner exec:java -Dexec.mainClass=com.Pipeline "-Dexec.args=--runner=DataflowRunner --queryString='SELECT time,type FROM [my-project:timeseries.my-data] where time between TIMESTAMP(\"2020-02-13T00:00:00Z\") and TIMESTAMP(\"2020-02-15T00:00:00Z\")'"
    
    SELECT time,type FROM `my-project.timeseries.my-data` where time between TIMESTAMP(\"2019-02-13T00:00:00Z\") and TIMESTAMP(\"2020-02-15T00:00:00Z\")