使用ValueProvider从数据流模板读取BigQuery时发生异常

时间:2018-11-28 10:49:15

标签: java google-cloud-platform google-bigquery google-cloud-dataflow apache-beam

我正在尝试创建一个可从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>

2 个答案:

答案 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());