我正在尝试创建一个可从BigQuery读取的模板,但不幸的是,尝试构建该模板时出现了异常。
执行Java类时发生异常。如果表格是动态设置的,则无法调用验证。
读取the documentation时,似乎从批处理模板读取BigQuery时要调用一个特殊功能:
注意:如果您要运行从BigQuery读取的批处理管道, 您必须在所有BigQuery读取中使用 .withTemplateCompatibility()。
所以,这是我的代码段:
PCollection<Discount> discountFromBigQuery = p.apply("Parse Discounts from BigQuery", BigQueryIO.read((SerializableFunction<SchemaAndRecord, Discount>) record -> {
GenericRecord row = record.getRecord();
return new Discount(row);
}).withTemplateCompatibility().from(options.getBigQueryDiscountPath()).withCoder(SerializableCoder.of(Discount.class)));
很明显,options.getBigQueryDiscountPath()
是ValueProvider<String>
那么,如何摆脱这个错误,并为BigQuery阅读部分提供模板?
以下是我使用的Maven依赖项:
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-core</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.google.cloud.dataflow</groupId>
<artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
<version>2.5.0</version>
</dependency>
答案 0 :(得分:1)
我认为您遇到的错误是here定义的。请注意说明,其中提到
请注意,如果创建表或数据集,则表或查询检查可能会失败 通过管道的早期阶段或查询是否依赖于早期阶段 管道的各个阶段。
要解决此问题,请尝试在您的BigQueryIO.read调用中添加withoutValidation method。
答案 1 :(得分:1)
顺便说一句,无需像下面这样在链的末尾添加noValidation()。
// queryString is of type ValueProvider<String>
PCollection<TableRow> rowsFromBigQuery = pipeline.apply(
BigQueryIO.readTableRows()
.fromQuery(queryString)
.usingStandardSql()
.withMethod(options.getReadMethod())
.withoutValidation());