将BigQuery联合表作为Dataflow中的源读取会引发错误

时间:2016-03-24 04:55:37

标签: google-bigquery google-cloud-dataflow

我在BigQuery中有一个联合源,它指向GCS中的一些CSV文件。

当我尝试将联合BigQuery表作为Dataflow管道的源读取时,它会引发以下错误:

    1226 [main] ERROR com.google.cloud.dataflow.sdk.util.BigQueryTableRowIterator  - Error reading from BigQuery table Federated_test_dataflow of dataset CPT_7414_PLAYGROUND : 400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Cannot list a table of type EXTERNAL.",
    "reason" : "invalid"
  } ],
  "message" : "Cannot list a table of type EXTERNAL."
}

Dataflow不支持BigQuery中的联合源,还是我做错了什么?我知道我可以直接将GCS中的文件读入我的管道,但由于应用程序的设计,我更喜欢使用BigQuery TableRow对象。

 PCollection<TableRow> results = pipeline.apply("fed-test", BigQueryIO.Read.from("<project_id>:CPT_7414_PLAYGROUND.Federated_test_dataflow")).apply(ParDo.of(new DoFn<TableRow, TableRow>() {
        @Override
        public void processElement(ProcessContext c) throws Exception {
            System.out.println(c.element());
        }
    }));

2 个答案:

答案 0 :(得分:4)

Dataflow BigQuery源旨在读取类型为“TABLE”的BigQuery托管表。 (类型定义可以在https://cloud.google.com/bigquery/docs/reference/v2/tables#type找到。)不支持EXTERNAL和VIEW表。

BigQuery“联合表”功能允许bigquery直接查询Google云端存储等地方的数据。 Dataflow还可以从Google云端存储中读取文件,因此您应该能够直接在要阅读的来源指向数据流计算。

答案 1 :(得分:4)

正如迈克尔所说,BigQuery不支持直接从EXTERNAL(联合表)或VIEWs读取:即使阅读也会有效地进行查询。

要从Dataflow中的这些表中读取,您可以改为使用

BigQueryIO.Read.fromQuery("SELECT * FROM table_or_view_name")

将发出查询并将结果保存到临时表,然后开始读取过程。当然,这将导致查询BigQuery的成本,因此如果您希望重复读取相同的VIEW或EXTERNAL表,您可能需要手动创建表。