Проверить, находится ли значение в столбце с помощью BigQuery, остановить при первом совпадении

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

Я хочу проверить, содержит ли столбец определенное значение, и остановиться при первом совпадении, если true.

В настоящее время я использую:

 select count(*) from <table> where <column> = <value>
 

А затем проверьте, является ли возвращаемое значение нулевым или ненулевым. Но если имеется несколько миллионов строк, а значение находится в первой строке, этот запрос все равно обработает все строки.

Я нашел что-то, что использует TOP , но эта команда, похоже, недоступна в большом запросе. Я тоже пробовал LIMIT , но это обрабатывает то же самое о данных, просто усекает возвращаемое значение.

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

Ответ №1:

BigQuery — это параллельная база данных, в которой одновременно выполняется множество потоков. В общем, я бы рекомендовал написать запрос следующим образом:

 select 1
from <table>
where <column> = <value>
limit 1;
 

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

Однако эти два запроса, вероятно, будут иметь одинаковую продолжительность. BigQuery — не лучшая база данных для «поиска иголок в стогах сена». Он предназначен для обработки огромных объемов данных.

Комментарии:

1. спасибо, насколько я могу судить, это обработает тот же объем данных, что и то, что я изначально опубликовал? Так что я предполагаю, что это общий совет по запросу, а не решение. Повторите ваш комментарий о поиске игл, возможно, в этом случае нет решения? Я предположил, что это будет, если мне нужно обработать весь столбец, тогда я сделаю это, хотя, я думаю

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

3. спасибо, это немного сбивает с толку, так как я не знаю, достаточно ли я знаю, чтобы закрыть вопрос, учитывая, что я хотел что-то, что останавливалось бы при первом совпадении, в результате чего конкретный запрос обрабатывал бы меньше данных. Если есть какая-либо информация, которую я могу добавить или что я попытаюсь сделать, возможно, из вашего ответа должно быть ясно, что это невозможно, и я просто упускаю суть

4. @baxx . , , Данные, которые будут взиматься, определяются до запуска запроса.

5. хорошо, конечно, но если я смогу обрабатывать меньше, то, независимо от платы, это может быть быстрее для пользователя, и на этот вопрос еще предстоит ответить. Хотя знание того, что независимо от объема обрабатываемых данных плата одинакова, является полезной информацией, так что спасибо

Ответ №2:

Если целью здесь является сокращение «обрабатываемых данных», в BigQuery могут сработать следующие подходы:

  • Разбиение таблицы на column , или
  • Кластеризация таблицы с помощью column , или
  • (если в таблице много дубликатов) создайте материализованное представление сбоку и попробуйте запросить это представление, например
 CREATE MATERIALIZED VIEW AS 
SELECT distinct <column> FROM <table>