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

Gra*_*ley 4 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."
}
Run Code Online (Sandbox Code Playgroud)

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

 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());
        }
    }));
Run Code Online (Sandbox Code Playgroud)

Mic*_*don 5

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

BigQuery 的“联合表”功能允许 bigquery 直接查询 Google Cloud Storage 等地方的数据。Dataflow 还可以从 Google Cloud Storage 读取文件,因此您应该能够将 Dataflow 计算直接指向要读取的源。

  • 是否在某处记录了 Dataflow 不支持从 BigQuery 读取视图或联合源?正确,就像我在帖子中所说的,我知道我可以直接从 GCS 读取数据,但我希望能够保持应用程序的设计一致并与 BigQuery TableRow 一起使用。 (2认同)

Dan*_*rin 5

正如 Michael 所说,BigQuery 不支持直接从 EXTERNAL(联合表)或 VIEW 读取:即使有效读取也需要查询。

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

BigQueryIO.Read.fromQuery("SELECT * FROM table_or_view_name")
Run Code Online (Sandbox Code Playgroud)

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