繁体   English   中英

资源超过 BigQuery

[英]Resources exceeded BigQuery

运行以下查询时出现错误:

查询执行期间超出资源:无法在分配的内存中执行查询。 峰值使用:限制的 158%。 顶级内存消费者:用于分析 OVER() 子句的排序操作:98% 其他/未归因:2%

select *, row_number() over(PARTITION BY Column_A ORDER BY Column_B)
from
(SELECT
*
FROM
  Table_1 UNION ALL
SELECT
  *
FROM
  Table_2 UNION ALL
SELECT
  *
FROM
  Table_3
)

有人可以帮助我如何更改此查询,或者我们是否可以更改 bigquery 中的内存限制?

欢迎亚伦,

此错误意味着 BigQuery 由于内存限制无法处理整个查询, ORDER BY函数占用大量内存,请尝试将其删除,我希望您的查询能够正常运行。

如果您需要对结果进行排序,请尝试将无序查询写入一个表,然后在该表上运行一个新查询来对结果进行排序。

如果你有兴趣。 这是一篇关于 BigQuery 如何在内存中执行的有趣文章: https ://cloud.google.com/blog/products/gcp/in-memory-query-execution-in-google-bigquery

我不相信您可以覆盖或更改此内存限制,但很高兴被证明是错误的。

确保你的ORDER BY在真正的最后一步被执行,此外,考虑使用LIMIT子句来避免“ Resources Exceeded ”或“ Response too large ”失败。

我在这里的主要建议是确保使用分区和集群。

分区适用于日期字段,因此如果您的 Table_1、Table_2... 有一个分区。

集群也极大地帮助 OVER 子句的内存成本与 ORDER BY 因为它对存储块进行排序( BigQuery 文档

为了充分利用上述两者,我还将用临时表替换您的 UNION ALL 子查询。 将 UNION ALL 的结果存储到内存中,对结果数据集进行分区+聚类,然后才计算排名在内存和存储方面效率更高中篇文章

您的最终陈述应类似于:

CREATE TEMP TABLE tmp
PARTITION BY date
CLUSTER BY column_A, column_B
AS
SELECT
*
FROM
  Table_1 UNION ALL
SELECT
  *
FROM
  Table_2 UNION ALL
SELECT
  *
FROM
  Table_3
;

select *, row_number() over(PARTITION BY Column_A ORDER BY Column_B) from tmp

我以前遇到过这个,结果我试图按具有“NULL”值的列进行分区。 删除 NULL 记录有效!

您可以在不使用 ORDER BY 的情况下尝试 OVER

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM