1

我在 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

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

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

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

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

4

1 回答 1

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
于 2012-12-19T16:49:45.087 回答