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
,但由于其中一个分组列来自as
(select 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 对整个数据集给出响应太大错误,但对等效子查询没有的主要内容,如果未能解决你的问题,请参考以下文章
在适用于 PHP 的 Google BigQuery API 中捕获“响应太大而无法返回错误”的正确方法是啥?
尝试 ORDER BY 时 BigQuery“响应太大而无法返回”
Google Bigquery 通过简单的选择说“响应太大而无法返回”
对 BigQuery 查询的错误响应:kind:discovery#restDescription 而不是 bigquery#queryResults