查询执行错误期间超出资源,Google BigQuery

Posted

技术标签:

【中文标题】查询执行错误期间超出资源,Google BigQuery【英文标题】:Resources exceeded during query execution error, Google BigQuery 【发布时间】:2013-09-03 18:28:59 【问题描述】:

有什么想法可以让这个查询在 Google BigQuery 上返回结果吗?我收到资源超出错误...数据集中大约有 2B 行。我正在尝试获取每个 user_id 出现最多的艺术家 ID。

select user_id, artist, count(*) as count
from [legacy20130831.merged_data] as d
group each by user_id, artist
order by user_id ASC, count DESC

【问题讨论】:

【参考方案1】:

对公共数据的等效查询,引发相同的错误:

SELECT actor, repository_name, count(*) AS count
FROM [githubarchive:github.timeline] AS d
GROUP EACH BY actor, repository_name
ORDER BY actor, count desc

与相同的查询进行比较,加上要返回的结果的限制。这个有效(对我来说是 14 秒):

SELECT actor, repository_name, count(*) as count
FROM [githubarchive:github.timeline] as d
GROUP EACH BY actor, repository_name
ORDER BY actor, count desc
LIMIT 100

您可以通过一小部分 user_ids 来代替使用 LIMIT。就我而言,1/3 有效:

SELECT actor, repository_name, count(*) as count
FROM [githubarchive:github.timeline] as d
WHERE ABS(HASH(actor) % 3)  = 0
GROUP EACH BY actor, repository_name

但您真正想要的是“获取每个 user_id 出现最多的艺术家 ID”。让我们更进一步,得到它:

SELECT actor, repository_name, count FROM (
  SELECT actor, repository_name, count, ROW_NUMBER() OVER (PARTITION BY actor ORDER BY count DESC) rank FROM (
    SELECT actor, repository_name, count(*) as count
    FROM [githubarchive:github.timeline] as d
    WHERE ABS(HASH(actor) % 10) = 0
    GROUP EACH BY actor, repository_name
))
WHERE rank=1

请注意,这次我使用了 %10,因为它可以更快地获得结果。但您可能想知道“我想用一个查询而不是 10 个查询来获得结果”。

你可以做两件事:

联合分区表(FROM 表达式中的逗号执行联合,而不是 BigQuery 中的连接)。 如果您仍然超出资源,您可能需要具体化该表。运行原始查询并将结果保存到新表中。在该表上运行 RANK() 算法,而不是在内存中的 GROUP 上运行。

如果您愿意与我分享您的数据集,我可以提供针对数据集的建议(很大程度上取决于基数)。

【讨论】:

那么,对于最后一个查询,获得 1/10 的结果,然后我们将它与其他查询结合以获得其他 9/10?或者这会让他们都明白吗? 是的,这里最后一个查询只得到结果的1/10。如果将 10 替换为 3,则为 1/3。微调很大程度上取决于数据的基数。作为一种猜测(无法查看数据),最具成本效益的方法是将 SELECT/FROM/WHERE/GROUP 输出到临时表,然后在其上运行 RANK()。 如果你愿意,我很乐意分享数据集——显然,用 20 而不是 10 修改仍然不够小。我想我可以通过电子邮件地址分享 - 我的地址是 jacobwgillespie@gmail.com,如果您想取得联系。 是的,按 50 修改也不起作用...那里有 21 亿行...这是我使用的查询:SELECT user_id,artist,count FROM (SELECT user_id,artist , count, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY count DESC) rank FROM ( SELECT user_id, artist, count(*) as count FROM [legacy20130831.merged_data] as d WHERE user_id % 50 = 0 GROUP EACH BY user_id, artist )) WHERE rank=1 我不是要线程劫持,但问题是 ORDER BY 有太多行——它(当前)是一个串行操作,每个查询只在一台机器上运行。听起来您实际上并不关心订单,您只想将每个用户的行放在一起。一种方法是通过 NEST 操作。我会跟进 Fh 的建议。

以上是关于查询执行错误期间超出资源,Google BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

带有“Order Each by”子句的 Google BigQuery 大表(105M 记录)产生“资源超出查询执行”错误

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

BigQuery:如何避免“查询执行期间超出资源”。错误

使用 FLATTEN 的 SQL 调用导致“错误:查询执行期间超出资源”

查询执行期间资源超出

当我使用 join each 时,查询执行期间资源超出