Большой запрос STRING_AGG() с несколькими полями выдает ошибку

#google-cloud-platform #google-bigquery

#google-cloud-platform #google-bigquery

Вопрос:

Мой запрос выглядит следующим образом

  SELECT
    DISTINCT id,
    STRING_AGG(DISTINCT column1) AS mobile,
    STRING_AGG(DISTINCT country) AS country,
    STRING_AGG(DISTINCT language) AS language,
    STRING_AGG(DISTINCT address) AS address,
    STRING_AGG(DISTINCT model) AS model,
    STRING_AGG(DISTINCT car) AS car,
    STRING_AGG(DISTINCT class) AS class,
    home_email,
    buisness_email,
    MAX(timestamp) AS timestamp
  FROM
    user
  GROUP BY
    id,
    home_email,
    buisness_email
  

Когда я запускаю этот запрос в своей таблице объемом 2 ТБ в bigquery и устанавливаю параметры запроса для экспорта выходных данных в таблицу, он выдает ошибку
Примечание: когда я запускаю его с объемом данных 500 ГБ, он работает нормально

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

Итак, как я могу решить эту проблему, пожалуйста?

Также после этого мне нужно будет выполнить тот же запрос для объединения this table с другой таблицей объемом 1 ТБ

Ответ №1:

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

Идея состоит в том, чтобы разделить agg на разные подзапросы. а затем объединить все эти подразделы.

 WITH agg_mobile AS (
 SELECT
    DISTINCT id,
    STRING_AGG(DISTINCT column1) AS mobile,
    home_email,
    buisness_email,
    MAX(timestamp) AS timestamp
  FROM
    user
  GROUP BY
    id,
    home_email,
    buisness_email
),
agg_country AS (
 SELECT
    DISTINCT id,
    STRING_AGG(DISTINCT country) AS country,
  FROM
    user
  GROUP BY
    id,
    home_email,
    buisness_email
)
....
SELECT agg_mobile.*,
       agg_country.country, 
       ....
FROM agg_mobile 
  LEFT JOIN agg_country ON agg_mobile.id = agg_country.id 
  LEFT JOIN .....
  

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

1. Большое вам спасибо. Это хорошая идея. Я попробую это сделать и сообщу вам о результате.

2. Я пробовал этот SELECT id, ARRAY_AGG(РАЗНЫЕ идентификаторы студентов) В КАЧЕСТВЕ идентификаторов студентов, MAX(date) В КАЧЕСТВЕ даты ОТ студентов, UNNEST(students_ids) В КАЧЕСТВЕ идентификаторов студентов, ГДЕ students_ids != «1111» ГРУППИРУЕТСЯ ПО идентификатору; —— и все еще не работает