Целочисленные разделы BigQuery - могу ли я использовать результаты другого запроса, чтобы получить список разделов для доступа? - PullRequest
0 голосов
/ 28 марта 2020

У меня большая таблица с целочисленными разделами (~ 1 ТБ). Мне нужно регулярно делать несколько небольших подмножеств этой таблицы. Это стоило дорого, но с помощью целочисленных разделов я могу снизить стоимость примерно на 95%. Это выглядит примерно так:

tbl_a: partition_index IN (1, 2, 5, 6, 7, 10, 11, 15, 104, 106, 111)

tbl_b: partition_index IN (3, 4, 5, 20, 21, 25, 16, 84, 201, 301, 302, 303)

и т. Д. И т. Д., С разными подтаблицами, использующими разные подмножества индекса , Это безобразно, как весь ад, но это работает. Я обеспокоен тем, что это будет трудно поддерживать, если мне нужно будет создать новую подтаблицу, и потенциальные перестановки изменятся, и мне придется отредактировать все файлы. sql для новых наборов значений индекса. У меня есть небольшая таблица, в которой есть все различные варианты критериев, которые я хочу, вместе со связанным значением индекса. запрос 5Kb для этой таблицы поиска индекса с фактическими критериями выбора субтаблицы дает список значений индекса, который при копировании и вставке прямо в файлы. sql сохраняет все работоспособным.

Однако для архитектурных По этой причине я не могу извлечь значения индекса из подзапроса и вставить их в виде строки в файлы. sql перед выполнением. Я имею в виду, я мог бы, и это сработало бы. Но это хакерское и плохое и не разумное решение. Тем не менее, я не могу найти способ, чтобы результаты маленького запроса к таблице поиска были использованы правильно. Это всегда приводит к полному сканированию таблицы. Есть идеи?

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

1 Ответ

2 голосов
/ 28 марта 2020

Позвольте мне воспроизвести вашу проблему.

SELECT MAX(views) max_views
FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
WHERE DATE(datehour) IN ('2019-03-27', '2019-04-10', '2019-05-10', '2019-10-10')
AND wiki='en'
AND title = 'Barbapapa'

1,4 ГБ обработано.

Но теперь у вас есть таблица с этими датами:

CREATE TABLE temp.some_dates AS (
  SELECT * 
  FROM UNNEST([DATE('2019-03-27'), '2019-04-10', '2019-05-10', '2019-10-10']) date
);

А теперь мы запустит запрос, который берет значения из этой таблицы:

SELECT MAX(views) max_views
FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
WHERE DATE(datehour) IN (SELECT * FROM temp.some_dates)
AND wiki='en'
AND title = 'Barbapapa'

1,4 ГБ обработано.

Нет проблем: обработано то же количество данных! Почему? Эта таблица кластеризована, кластеризуйте ваши таблицы.

Но давайте посмотрим v2 этой таблицы, если бы вещи не были кластеризованы:

SELECT MAX(views) max_views
FROM `fh-bigquery.wikipedia_v2.pageviews_2019` 
WHERE DATE(datehour) IN ('2019-03-27', '2019-04-10', '2019-05-10', '2019-10-10')
AND wiki='en'
AND title = 'Barbapapa'

26,5 ГБ обработано. Это намного больше, чем 1,4 ГБ. Если бы я только сгруппировал эту таблицу.

А если мы возьмем даты из другой таблицы?

SELECT MAX(views) max_views
FROM `fh-bigquery.wikipedia_v2.pageviews_2019` 
WHERE DATE(datehour) IN (SELECT * FROM `temp.some_dates`)
AND wiki='en'
AND title = 'Barbapapa'

2,3 ТБ.

Ого, это было бы действительно сканирование большого стола. Я должен был сгруппировать свои таблицы.

Но можно ли как-то это исправить?

Да:

DECLARE some_dates ARRAY<DATE> DEFAULT (SELECT ARRAY_AGG(date) FROM `temp.some_dates`);


SELECT MAX(views) max_views
FROM `fh-bigquery.wikipedia_v2.pageviews_2019` 
WHERE DATE(datehour) IN UNNEST(some_dates)
AND wiki='en'
AND title = 'Barbapapa'

26,46 ГБ обработано.

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

enter image description here

Тем не менее, мой лучший совет: кластеризируйте ваши столы.

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