BigQuery 对整个数据集给出响应太大错误,但对等效子查询没有

Posted

技术标签:

【中文标题】BigQuery 对整个数据集给出响应太大错误,但对等效子查询没有【英文标题】:BigQuery gives Response Too Large error for whole dataset but not for equivalent subqueries 【发布时间】:2012-12-19 02:10:13 【问题描述】:

我在 BigQuery 中有一个包含以下字段的表:

time,a,b,c,d

time 是 ISO8601 格式的字符串,但有空格,a 是 1 到 16000 的整数,其他列是字符串。该表包含一个月的数据,每天有几百万条记录。

以下查询因“响应过大”而失败:

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,b,c,d,count(a),count(distinct a, 1000000)
from [myproject.mytable]
group by day,b,c,d
order by day,b,c,d asc

但是,此查询有效(数据从 2012-01-01 开始)

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,
  b,c,d,count(a),count(distinct a)
from [myproject.mytable]
where UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) = UTC_USEC_TO_DAY(PARSE_UTC_USEC('2012-01-01 00:00:00'))
group by day,b,c,d
order by day,b,c,d asc

这看起来可能与this issue 有关。但是,由于group by 子句,顶部查询相当于重复调用第二个查询。查询规划器无法处理这个问题吗?

编辑:澄清我的测试数据:

我正在使用我生成的虚假测试数据。我最初使用了几个字段并尝试获取一个月的每小时摘要(group by hour,其中小时是在查询的select 部分中使用as 定义的)。当失败时,我尝试切换到每日。当失败时,我减少了所涉及的列。使用count (distinct xxx, 1000000) 时也失败了,但是当我只做了一天的工作时它就起作用了。 (如果我删除 1000000 参数,它也可以工作,但由于 确实 适用于一日查询,因此查询规划器似乎没有像我预期的那样分离事物。)

检查 count (distinct) 的基数为 16,000,按列分组的基数为 2 和 20,总共只有 1200 行。列值很短,大约十个字符。

【问题讨论】:

【参考方案1】:

您期望有多少结果?当前允许的结果总大小限制为大约 64MB。如果您期望结果是数百万行,那么这可能是一个预期错误。

如果结果数量不是很大,可能是大小问题不是最终响应,而是内部计算。具体来说,如果 GROUP BY 的结果太多,则查询可能会耗尽内存。一种可能的解决方案是将“GROUP BY”更改为“GOUP EACH BY”,这会改变查询的执行方式。这是一项目前处于试验阶段的功能,因此尚未记录在案。

对于您的查询,由于您在 group by 中引用了 select 中命名的字段,因此您可能需要这样做:

select day, b,c,d,day,count(a),count(distinct a, 1000000) 
FROM (
    select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day, b, c, d
    from [myproject.mytable]
)
group EACH by day,b,c,d
order by day,b,c,d asc

【讨论】:

感谢您的回答;我提出了有关我的数据的更多详细信息,并且我注意到(对不起!)我没有包括我将最大精确计数提高到不同。我试过group each by,但由于其中一个分组列来自asselect utc_usec_to_day(time) as day),它给了我错误Error: Field day was used in the query, but could not be found. 问题可能是内存。当您使用 count(distinct xxx, 1000000) 时,这意味着执行引擎必须为每个 group by 结果跟踪多达 100000 个条目。因此,如果您有 1200 个预期行,则需要在计算树的根中分配 1.2*10^9 值的存储空间。 我已经更新了我的答案,以解释我如何相信该组每个人都可以为您工作。

以上是关于BigQuery 对整个数据集给出响应太大错误,但对等效子查询没有的主要内容,如果未能解决你的问题,请参考以下文章

应用脚本:对于 bigquery 的响应太大

在适用于 PHP 的 Google BigQuery API 中捕获“响应太大而无法返回错误”的正确方法是啥?

大查询大数据集查询出错

尝试 ORDER BY 时 BigQuery“响应太大而无法返回”

Google Bigquery 通过简单的选择说“响应太大而无法返回”

对 BigQuery 查询的错误响应:kind:discovery#restDescription 而不是 bigquery#queryResults