Java 数据流上的Apache Beam不接受BigQuery的ValueProvider 目标
我的目标是创建一个指定ApacheBeam管道的数据流模板。管道以批处理模式运行,从BigQuery读取数据,然后在别处执行转换和写入。最重要的是,我用于读取BigQuery的查询必须在运行时提供 预期行为 预期结果是管道将使用运行时参数指定BigQuery查询,执行查询,然后继续管道的其余部分 实际行为 实际行为是忽略我传入的运行时参数,而是使用创建GCS模板时必须指定的参数 相关代码 下面是我如何指定读取操作,以及如何定义和传入查询参数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
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编译参数中删除它
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\")