Как объединить и сгруппировать строки в большой таблице BigQuery с проблемами «Превышены ресурсы» - PullRequest
1 голос
/ 04 апреля 2019

У меня есть одна таблица полей с 1,1 миллиарда строк в BigQuery.

Свойства таблицы:

  1. Одно поле, где Имя поля - идентификатор и Тип поля - Строка
  2. Общий размер таблицы - 8,3 ГБ

Я хотел бы создать новый как следует:

  1. Первый столбец - это поле UUID с использованием GENERATE_UUID ()
  2. Второй столбец id_str, который содержит 25 000 записей id, объединенных в этот столбец со значениями id, разделенными запятыми

Я пробовал разные решения, но продолжаю сталкиваться с

«Превышены ресурсы»

Есть ли разумный способ обойти это ограничение? Любой другой подход для решения моей проблемы внутри BigQuery?

Код, который у меня есть на данный момент, генерирует вышеупомянутую ошибку

SELECT
  GENERATE_UUID() as batch_id,
  STRING_AGG(id) as ids_str
from
  (
  WITH vars AS (
  SELECT 25000 as rec_count
)
  SELECT
    cast(ceiling(ROW_NUMBER() OVER ()  / 25000) as int64) as batch_count,
    25000 as rec_count,
    cast(id as string) as id
  FROM
    tbl_profile
)
group by rec_count

1 Ответ

1 голос
/ 05 апреля 2019

Есть ли другой способ решить мою проблему внутри BigQuery?

Если ваш вариант использования позволяет вам немного ослабить требования, вместо

The second column to be 25,000 id concatenated into one column   

это будет

The second column to be about (close to) 25,000 id concatenated into one column    

В этом случае ниже (для BigQuery Standard SQL) может / должно работать хорошо для вас

#standardSQL
SELECT
  GENERATE_UUID() AS batch_id,
  COUNT(1) batch_size,
  STRING_AGG(id) AS ids_str
FROM (
  SELECT
    CAST((cnt * RAND()) / 25000 + 0.5 AS INT64) AS batch_count,
    CAST(id AS STRING) AS id
  FROM `project.dataset.table`
  CROSS JOIN (SELECT COUNT(1) cnt FROM `project.dataset.table`)
)
GROUP BY batch_count

это должно дать результат как показано ниже

enter image description here

Как вы можете видеть здесь, число идентификаторов в каждой строке не точно 25 000, но достаточно близко к этому

Надеюсь, что это может быть вариант для вас

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