【发布时间】:2019-07-08 15:25:48
【问题描述】:
我正在尝试根据组织所在的城市和州从我们的数据库中检索组织列表,并按属性 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
我们将不胜感激!
【问题讨论】:
-
样本数据真的很有帮助。
标签: sql memory google-bigquery