【问题标题】:Exception when reading BigQuery from Dataflow template using ValueProvider使用 ValueProvider 从 Dataflow 模板读取 BigQuery 时出现异常
【发布时间】:2019-04-30 06:11:03
【问题描述】:

我正在尝试创建一个从 BigQuery 读取的模板,不幸的是,我在尝试构建该模板时遇到了异常。

执行 Java 类时发生异常。如果表是动态设置的,则无法调用 validate。

阅读the documentation,似乎在从批处理模板中读取BigQuery时需要调用一个特殊的函数:

注意:如果您想运行从 BigQuery 读取数据的批处理流水线, 您必须在所有 BigQuery 读取中使用 .withTemplateCompatibility()

所以,这是我的代码 sn-p :

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&lt;String&gt;

那么,我怎样才能摆脱这个错误并模板化 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>

【问题讨论】:

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


    【解决方案1】:

    我相信您面临的错误定义为here。请注意解释,提到

    请注意,如果创建表或数据集,则表或查询检查可能会失败 通过管道的早期阶段,或者如果查询依赖于早期 管道的各个阶段。

    要克服这个问题,请尝试在您的 BigQueryIO.read 调用中添加 withoutValidation method

    【讨论】:

    • 是的,我设法使用这种方法生成了一个模板。但是这个方法执行什么验证呢?
    • 根据文档,withoutValidation 方法禁用:在提交管道之前验证表存在或查询成功。仍然会验证是否指定了查询或表。
    【解决方案2】:

    顺便说一句,需要在链的末尾添加 withoutValidation() ,如下所示。

        // queryString is of type ValueProvider<String>
        PCollection<TableRow> rowsFromBigQuery = pipeline.apply(
                    BigQueryIO.readTableRows()
                            .fromQuery(queryString)
                            .usingStandardSql()
                            .withMethod(options.getReadMethod())
                            .withoutValidation());
    

    【讨论】:

      猜你喜欢
      • 2022-08-02
      • 1970-01-01
      • 2020-02-17
      • 2016-08-24
      • 2017-08-14
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      相关资源
      最近更新 更多