我有一个大表(大约 5900 万行,7.1 GB)已经按我的需要排序了,我想查询这个表并为表的每一行获取一个 row_number() 。
不幸的是我得到了错误
Resources exceeded during query execution: The query could not be executed in the allotted memory.
有没有办法增加 BigQuery 中的分配内存?
这是我的查询,我不知道如何简化它,但是如果您有任何建议,我会接受
SELECT
row_number() over() as rowNumber,
game,
app_version,
event_date,
user_pseudo_id,
event_name,
event_timestamp,
country,
platform
FROM
`mediation_time_BASE`
这是完整的错误消息:Resources exceeded during query execution: The query could not be executed in the allotted memory. Peak usage: 146% of limit. Top memory consumer(s): analytic OVER() clauses: 98% other/unattributed: 2%
编辑:
此处的查询表示事件开始和结束的列表,我需要将开始事件与其结束联系起来,因此我遵循以下提示:https://www.interfacett.com/blogs/how-to-use-values-from-previous-or-next-rows-in-a-query-in-sql-server/
为此,我需要将行与 row_number() 分开,以便将这个子查询分成 2 个(事件开始在另一只手,事件在另一只手结束),加入它们,然后每个事件有一行,开始和结束事件,如下(其中子查询用 row_number() 表示查询):
SELECT
(case when lead(inter.rowNumber) OVER(ORDER BY inter.rowNumber) - inter.rownumber =1
then lead(inter.rowNumber) OVER(ORDER BY inter.rowNumber)
else inter.rownumber end) as rowNumber,
min(inter_success.rowNumber) as rowNumber_success,
inter.game,
inter.app_version,
inter.event_date,
inter.user_pseudo_id,
inter.event_timestamp as event_start,
min(inter_success.event_timestamp) as event_end,
inter_success.event_name as results
FROM
(SELECT * FROM `subquery` where event_name = 'interstitial_fetch') as inter INNER JOIN
(SELECT * FROM `subquery` where event_name = 'interstitial_fetch_success') as inter_success
ON inter.rowNumber < inter_success.rowNumber and inter.game= inter_success.game and inter.app_version = inter_success.app_version and inter.user_pseudo_id = inter_success.user_pseudo_id
GROUP BY inter.rowNumber,inter.game,inter.app_version,inter.event_date,inter.user_pseudo_id,inter.event_timestamp,inter_success.event_name
这适用于较小的数据集,但不适用于 5900 万行......
最佳答案
TL;DR:您不需要为 BigQuery 增加内存。
为了回答这个问题,您需要了解 BigQuery 的工作原理。 BigQuery 依赖于名为 的执行器机器插槽 .这些插槽的类型都相似,并且内存量有限。
现在,许多操作在多个槽之间拆分数据(如 GROUP BY),每个槽对一部分数据执行归约并将结果向上发送到执行树中。
有些操作必须在单机上执行 (如 SORT 和 OVER)见 here .
当您的数据溢出插槽的内存时,您会遇到所描述的错误。因此,您真正需要的是将插槽类型更改为更高内存的机器。不幸的是,这是不可能的。您必须遵循查询最佳实践,以避免对过多数据进行单槽操作。
可以帮助您的一件事是使用 PARTITIONS 计算 OVER(),因此每个分区将被发送到不同的机器。 see this example .如果您还没有这样做,那么通常有帮助的另一件事是转向 STANDARD SQL。
关于google-bigquery - 有没有办法增加 BigQuery 中查询的分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56165669/