В Google BigQuery превышены ресурсы - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь получить список организаций из нашей базы данных на основе города и штата организаций, сгруппированных по атрибуту org_name.Эти организации имеют несколько вложенных массивов в качестве других атрибутов.Я должен развернуть агрегированный массив LOCATIONS, чтобы запросить правильные местоположения.Поскольку я группирую по имени организации, я объединяю оставшиеся нужные атрибуты с ARRAY_CONCAT_AGG для каждого массива, а затем запускаю пользовательскую функцию с именем dedup, чтобы удалить любые повторяющиеся значения, поскольку все требуемые атрибуты должны быть сгруппированы или агрегированы.Это отлично работает на небольшом столе, но по мере увеличения я получаю следующую ошибку:

Resources exceeded during query execution: The query could not be executed in the allotted memory. Peak usage: 116% of limit. Top memory consumer(s): aggregate functions and GROUP BY clauses: 95% other/unattributed: 5%.

Код выглядит следующим образом:

CREATE TEMP FUNCTION
  dedup(val ANY TYPE) AS ((
    SELECT
      ARRAY_AGG(t)
    FROM (
      SELECT
        DISTINCT *
      FROM
        UNNEST(val) v) t ));

SELECT
  org_name,
  dedup(ARRAY_CONCAT_AGG(sizes)) AS sizes,
  dedup(ARRAY_CONCAT_AGG(org_nums)) AS org_nums,
  dedup(ARRAY_CONCAT_AGG(location)) AS location,
  dedup(ARRAY_CONCAT_AGG(types_of_professionals)) AS types_of_professionals,
  dedup(ARRAY_CONCAT_AGG(specialties)) AS specialties
FROM
  `merging_npi_medicare.practices`,
  UNNEST(location) AS loc
WHERE
  loc.professional_city = "HARRISBURG"
  AND loc.professional_state = "PA"
GROUP BY
  org_name

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

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

https://i.stack.imgur.com/8nJpb.png

Любая и вся помощь будет оценена!

1 Ответ

1 голос
/ 08 июля 2019

Я должен немного поразмышлять над тем, как выглядят данные. Но перефразирует ли это так, чтобы решить проблему?

select org_name,
       (select array_agg(s.size)
        from `merging_npi_medicare.practices` p cross join
             unnest(sizes) s
        where p.org_name = o.org_name
       ) as sizes
from (select distinct org_name
      from `merging_npi_medicare.practices` cross join
           unnest(location) AS loc
      where loc.professional_city = 'HARRISBURG' and
            loc.professional_state = 'PA'
     ) o;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...