Google BigQuery超出资源

时间:2019-07-08 15:25:48

标签: sql memory google-bigquery

我正在尝试根据组织的城市和州从我们的数据库中检索组织列表,并按属性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 个答案:

答案 0 :(得分:1)

我不得不推测一下数据是什么样的。但是这样改写是否可以解决问题?

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;