Создание попарной комбинации идентификаторов очень большой таблицы в bigquery - PullRequest
0 голосов
/ 28 декабря 2018

У меня очень большая таблица идентификаторов (строка), которая содержит 424 970 строк и только один столбец.

Я пытаюсь создать комбинацию этих идентификаторов в новой таблице.Мотивация для создания этой таблицы может быть найдена в этом вопросе .

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

#standardSQL
SELECT
  t1.id AS id_1,
  t2.id AS id_2
FROM
  `project.dataset.id_vectors` t1
INNER JOIN
  `project.dataset.id_vectors` t2
ON
  t1.id < t2.id

Но запросчерез 15 минут происходит сбой со следующим сообщением об ошибке:

Query exceeded resource limits. 602467.2409093559 CPU seconds were used, and this query must use less than 3000.0 CPU seconds. (error code: billingTierLimitExceeded)

Есть ли обходной путь для выполнения запроса и получения нужной выходной таблицы со всеми комбинациями идентификаторов?

1 Ответ

0 голосов
/ 29 декабря 2018

Вы можете попробовать разбить вашу таблицу T на 2 меньшие таблицы T1 и T2, затем выполнить 4 объединения для каждой из меньших таблиц T1: T1, T1: T2, T2: T1, T2: T2, а затем объединить результаты.Это будет эквивалентно присоединению T к себе.Если это не помогло, попробуйте разбить его на таблицы меньшего размера.

В качестве альтернативы установите maximumBillingTier на более высокое значение https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs.

configuration.query.maximumBillingTier - Limitsуровень биллинга для этой работы.Запросы, использующие ресурсы за пределами этого уровня, не будут выполняться (без взимания платы).Если не указано, для этого проекта будет задано значение по умолчанию.

Если используется Java, его можно установить в JobQueryConfiguration.Это свойство конфигурации в настоящий момент не поддерживается в консоли пользовательского интерфейса.


Чтобы разделить таблицу, вы можете использовать функцию FARM_FINGERPRINT в BigQuery.Например, первая часть будет иметь фильтр:

where mod(abs(farm_fingerprint(id)), 10) < 5

А вторая часть будет иметь фильтр:

where mod(abs(farm_fingerprint(id)), 10) >= 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...