Как я могу уменьшить объем данных, проверенных BigQuery во время запроса? - PullRequest
0 голосов
/ 26 октября 2019

Кто-нибудь скажет и объяснит правильный ответ на следующий вопрос с несколькими вариантами ответов?

У вас есть запрос, который фильтрует таблицу BigQuery с использованием предложения WHERE в столбцах меток времени и ID. Используя bq query –-dry_run, вы узнаете, что запрос запускает полное сканирование таблицы, даже несмотря на то, что фильтр по метке времени и идентификатору выбирает небольшую часть общих данных. Вы хотите уменьшить объем данных, сканируемых BigQuery, с минимальными изменениями в существующих SQL-запросах. Что делать?

  1. Создать отдельную таблицу для каждого идентификатора.
  2. Используйте ключевое слово LIMIT, чтобы уменьшить количество возвращаемых строк.
  3. Создайте таблицу заново с помощьюстолбец разделения и столбец кластеризации.
  4. Используйте флаг bq query --maximum_bytes_billed, чтобы ограничить количество выставляемых байтов.

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Если предположить, что это единственные четыре возможных ответа, ответ почти наверняка будет следующим: «Создайте заново таблицу с разделительным столбцом и столбцом кластеризации».

Позволяет исключить остальные:

  • Используйте ключевое слово LIMIT, чтобы уменьшить количество возвращаемых строк.

Это не поможет, поскольку LIMIT применяется только после того, как полное сканирование таблицы уже выполнено , поэтому вам все равно будет выставлен счет, несмотря на ограничение.

  • Создайте отдельную таблицу для каждого идентификатора.

Это вряд ли поможетКроме того, что в дополнение к организационной неразберихе, вам придется запрашивать каждую таблицу, чтобы найти все правильные временные метки, и обрабатывать тот же объем данных, что и раньше (но с гораздо большей работой).

  • Используйте флаг bq query --maximum_bytes_billed, чтобы ограничить количество выставляемых байтов.

Вы могли бы сделать это, но тогда запрос завершится неудачно , когда будет выставлено максимальное количество байтовбыли слишком высоки, так что вы бы нене получите ваши результаты.


Так почему разбиение и кластеризация ?

BigQuery (по запросу) биллинг основано на выбранных столбцах и объеме данных, которые вы читаете в этих столбцах. Таким образом, вы хотите сделать все возможное, чтобы уменьшить объем обрабатываемых данных.

В зависимости от конкретного запроса, разбиение по отметке времени позволяет сканировать данные только за соответствующие дни. Очевидно, что это может быть огромной экономией по сравнению со сканированием всей таблицы.

Кластеризация позволяет объединять часто используемые данные в таблицу путем сортировки на основе столбца кластеризации, что исключает необходимость сканирования ненужного сканирования. данные на основе фильтра (предложение WHERE). Таким образом, вы сканируете меньше данных и снижаете свои расходы. Аналогичное преимущество для агрегации данных.

Это, конечно, предполагает, что вы хорошо понимаете запросы, которые вы фактически делаете, и какие столбцы имеют смысл кластеризовать.

0 голосов
/ 26 октября 2019

Насколько я знаю, единственный способ ограничить количество байтов, считываемых BigQuery, - это либо удаление (полностью) ссылок на столбцы, удаление ссылок на таблицы, либо разбиение (и, возможно, кластеризация в некоторых случаях).

Одна из проблем, возникающих при запуске BigQuery, заключается в том, что такой запрос:

select *
from t
limit 1;

может быть очень, очень дорогим.

Однако такой запрос:

select sum(x)
from t;

на той же таблице может быть довольно дешевым.

Чтобы ответить на вопрос, вы должны узнать больше о том, как BigQuery выставляет счета за использование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...