我在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());
}
}));
答案 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表,您可能需要手动创建表。