有没有办法增加 BigQuery 中查询的分配内存?

Sop*_*lin 5 google-bigquery

我有一个大表(大约 5900 万行,7.1 GB)已经按我的需要排序了,我想查询这个表并为表的每一行获取一个 row_number() 。不幸的是我得到了错误

查询执行期间资源超出:无法在分配的内存中执行查询。

有没有办法增加 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`
Run Code Online (Sandbox Code Playgroud)

这是完整的错误消息:

查询执行期间资源超出:无法在分配的内存中执行查询。峰值使用量:限制的 146%。顶级内存消费者:分析 OVER() 子句:98% 其他/未归因: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
Run Code Online (Sandbox Code Playgroud)

这适用于较小的数据集,但不适用于 5900 万行......

gid*_*utz 6

TL;DR:您不需要为 BigQuery 增加内存。

为了回答这个问题,您需要了解 BigQuery 的工作原理。BigQuery 依赖于称为slot 的执行器机器。这些插槽的类型都相似,并且内存量有限。

现在,许多操作在多个槽之间拆分数据(如 GROUP BY),每个槽对一部分数据执行归约并将结果向上发送到执行树中。

某些操作必须在单台机器上执行(如 SORT 和 OVER),请参见此处。当您的数据溢出插槽的内存时,您会遇到所描述的错误。因此,您真正需要的是将插槽类型更改为更高内存的机器。不幸的是,这是不可能的。您必须遵循查询最佳实践,以避免对过多数据进行单槽操作。

可以帮助您的一件事是使用 PARTITIONS 计算 OVER(),因此每个分区将被发送到不同的机器。看这个例子。如果您还没有这样做,那么通常有帮助的另一件事是转向 STANDARD SQL。


Pad*_*eye 1

根据官方文件,您需要请求增加预订​​的时段......

\n\n
\n

按需定价的每个项目最大并发槽数 \xe2\x80\x94 2,000

\n\n

按需查询的默认槽数由单个项目中的所有\n 查询共享。通常,如果您一次处理的查询少于 100 GB,则不太可能使用全部 2,000 个槽。

\n\n

要检查您正在使用的插槽数量,请参阅使用\n Stackdriver 监控 BigQuery。如果您需要超过 2,000 个插槽,请联系您的销售代表讨论统一费率定价是否满足您的需求。

\n
\n\n

插槽1请参考this ,请求更多内存的过程在这里2

\n