0

Я некоторое время играю вокруг с потоком данных/bigquery, но я все еще не могу окунуться в некоторые основные вещи, а именно: , когда использовать определенный тип от метод запрос стол.BigQueryIO.Read Query vs. Jobs: Query

Опция запроса одна линия с BigQueryIO.Read является:
+ короткий и простой,
+ подходит для больших результатов, которые возвращаются в PCollection,
- но не возвращает новую схему таблицы для результата,
затрудняет экспорт как в (1). CSV-файл (ы) - заголовок таблицы, полей !! и (2) таблица bigquery - нет схемы! Нам нужно вручную определить схему таблицы или заголовок поля-csv каждый раз, когда мы хотим сохранить результаты запроса в таблице bigquery или .csv.
---> Есть ли автоматический способ сделать это элегантно?

Другой вариант запроса - использование Jobs : Query.
Это снова преимущества и недостатки:
+ возвращает схему таблицы результата запроса
- требует проверки подлинности, в конце концов, есть намного больше кодирования для точного простого запроса
-> асинхронных и синхронный режим;
- не подходит для больших результатов, за исключением
в асинхронном режиме с опцией allowLargeResults, что приводит к несколько запросов в фоновом режиме, которые должны быть составлены, чтобы получить полный список извлекаемых строк (??)
- результаты могут сохраняться в таблице, но только асинхронный запрос может сохранять результаты в постоянной таблице (а не только во временную).

Осталось вопросов:

(1) Какой метод лучше и когда?

(2) Если в таблице мы запрашиваем очень большой объем данных, и мы получаем очень большой результат, какой метод запроса тогда предпочтительнее?

(3) Какой экспорт предпочтительнее при обработке очень больших результатов - таблицы или файла CSV?

+0

, основанный на моем предыдущем вопросе http://stackoverflow.com/questions/34518795/get-tableschema-from-bigquery-result-pcollectiontablerow – user2107356

+0

Я пытаюсь ответить на этот вопрос, но неясно, чего вы на самом деле хотите. Вы спрашиваете о некоторых очень низких проблемах - можете ли вы описать фактическую сквозную обработку данных, которую вы пытаетесь сделать? –

+0

Обратите внимание, что если все, что вы хотите сделать, это сохранить результат запроса, вероятно, вы должны просто использовать асинхронный API BigQuery для запуска запроса, а затем экспортировать CSV в GCS. –

ответ

1

Обратите внимание, что BigQueryIO.Read считывает таблицу и не выполняет запрос. Помощник .fromQuery() позволяет источнику выполнить запрос, а затем прочитать таблицу назначения, в которую были записаны результаты запроса. Может быть полезно отделить выполнение запроса от чтения таблицы.

Мы можем думать, что BigQueryIO.Read работает под управлением jobs.insert() для операции экспорта в Google Cloud Storage, а затем обрабатывает данные из GCS.

Посмотрите на «Множественный подстановочный знак Uris» по адресу https://cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple для эффективной параллельной обработки данных, экспортируемых в GCS: вы можете потреблять (небольшие) осколки экспортируемых данных по мере их экспорта, поэтому вам не нужно блокировать обработку параллельные операции чтения для всего задания экспорта BigQuery. Множественные подстановочные знаки позволяют определить параллелизм работников впереди, и BigQuery будет записывать данные в порядок, чтобы каждый работник мог самостоятельно обрабатывать свои осколки и определять, когда их подмножество данных полностью обработано.

Cloud Dataflow поддерживает пользовательские источники (https://cloud.google.com/dataflow/model/custom-io#creating-sources), поэтому вы можете реплицировать BigQueryIO.Read с версией, которая имеет боковой канал для схемы таблицы, в которой вы работаете (*).

(*) Я не эксперт по облачным данным, поэтому я не уверен, как построить этот боковой канал. Возможно, схема, экспортированная из этого настраиваемого источника, является схемой таблицы и блобом, и вы можете обернуть источник ParDo, который принимает схему и преобразует blob в эту схему? В этот момент ваш код увидит схему и данные для каждой строки. Это не похоже на самый эффективный способ решения проблемы, но это может сработать для вас.