BigQuery为整个数据集提供了响应太大的错误,但对于等效的子查询则没有

时间:2012-12-19 02:10:14

标签: google-bigquery

我在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,其中小时是使用查询的as部分中的select定义的。当失败时我尝试切换到每天。当失败时,我减少了所涉及的列。使用count (distinct xxx, 1000000)时也失败了,但是当我只做了一天的价值时,它就有效了。 (如果我删除了1000000参数,它也有效,但由于 使用了一天的查询,所以查询规划器似乎没有像我期望的那样分离事物。)

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

1 个答案:

答案 0 :(得分: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