2016-03-24 3 views
2

У меня есть источник федерации в BigQuery, который указывает на некоторые файлы CSV в GCS.Чтение BigQuery федеративной таблицы как источника в Dataflow вызывает ошибку

Когда я пытаюсь читать таблицы объединения 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

Какой бегун вы используете? «DirectPipelineRunner», «DataflowPipelineRunner» или «BlockingDataflowPipelineRunner»? –

+0

DirectPipelineRunner –

+0

@polleyg Мы добавили еще один ответ, если это поможет. –

ответ

2

Как говорит Майкл, BigQuery не поддерживает прямое чтение из EXTERNAL (федеративных таблиц) или VIEWs: даже чтение эффективно берет запрос.

Для чтения из этих таблиц в DataFlow, вы можете использовать вместо этого

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

, который будет выдавать запрос и сохранить результат во временную таблицу, а затем начать процесс чтения. Конечно, это потребует затрат на запросы на BigQuery, поэтому, если вы хотите повторно читать из той же таблицы VIEW или EXTERNAL, вы можете вручную создать таблицу.

4

Источник данных BigQuery источника данных был разработан для чтения управляемых таблиц BigQuery типа «ТАБЛИЦА». (Определение типа можно найти по адресу https://cloud.google.com/bigquery/docs/reference/v2/tables#type.) Таблицы EXTERNAL и VIEW не поддерживаются.

Функция «Объединенная таблица» BigQuery позволяет bigquery напрямую запрашивать данные в таких местах, как Google Cloud Storage. Dataflow также может читать файлы из облачного хранилища Google, поэтому вы должны указывать свое вычисление потока данных непосредственно в источниках, которые вы хотите прочитать.

+1

Описан ли документ где-то, что Dataflow не поддерживает чтение просмотров или федеративных источников из BigQuery? Правильно, как я уже сказал в своем посте, я знаю, что я могу читать непосредственно из GCS, но я хотел бы поддерживать дизайн приложения и работать с BigQuery TableRow. –

+1

Это не фундаментальная проблема с потоками данных: это (очень разумное) ограничение API-интерфейсов BigQuery. Я отправил https://issues.apache.org/jira/browse/BEAM-174, чтобы повысить качество уведомления о потоке данных. Хотя мы могли автоматически превратить команду 'from (table)' в команду 'fromQuery (" select * from table "), мы решили не делать так, чтобы пользователи сознательно выбирали стоимость запроса. –

Смежные вопросы