我正在写一个后台作业来自动处理BigQuery中的A/B测试数据,并且发现在执行大型GROUP EACH BY语句时遇到“查询执行期间超出资源”的情况。从Resources Exceeded during query execution中我看到减少组的数量可以使查询成功,因此我将数据分成较小的部分,但是我仍然遇到错误(尽管不那么频繁)。更好地了解导致此错误的原因,这将是很好的。特别是:
有问题的查询看起来像这样(实际上,它用作子查询,而外部查询聚合结果):
SELECT
alternative,
snapshot_time,
SUM(column_1),
...
SUM(column_139)
FROM
my_table
CROSS JOIN
[table containing 24 unix timestamps] timestamps
WHERE last_updated_time < timestamps.snapshot_time
GROUP EACH BY alternative, user_id, snapshot_time
(以下是一个示例失败的作业:124072386181:job_XF6MksqoItHNX94Z6FaKpuktGh4)
我意识到此查询可能会带来麻烦,但是在这种情况下,该表只有22MB,并且查询结果不足一百万个组,并且仍然因“超出资源”而失败。减少立即处理的时间戳数可以解决该错误,但是我担心我最终会遇到足够大的数据规模,以致整个这种方法将无法正常工作。
最佳答案
您已经猜到了,BigQuery根据要操作的表的大小为GROUP EACH和JOIN EACH查询选择许多并行工作程序(分片)。这是一种粗略的启发式方法,但实际上,它的效果很好。
您的查询有趣的是,由于CROSS JOIN的扩展,GROUP EACH正在比原始表更大的表上完成。因此,我们选择的分片数量对于您的查询而言太小了。
要回答您的特定问题:
解决方法是,将CROSS JOIN的中间结果另存为表,然后在该临时表上运行GROUP EACH BY。那应该让BigQuery在选择分片数量时使用扩展大小。 (如果这不起作用,请让我知道,我们可能需要调整分配阈值)。
关于google-bigquery - 在BigQuery中使用GROUP EACH BY了解 "Resources exceeded during query execution",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22600299/