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

Google bigquery 对于整个数据集,BigQuery给出的响应错误太大,但对于等效的子查询则没有,google-bigquery,Google Bigquery,我在BigQuery中有一个包含以下字段的表: time,a,b,c,d time是ISO8601格式的字符串,但带有空格,a是1到16000之间的整数,其他列是字符串。该表包含一个月的数据,每天有几百万条记录 以下查询因“响应太大”而失败: 但是,此查询有效(数据从2012-01-01开始) 这看起来可能与你的行为有关。但是,由于GROUPBY子句,顶部查询相当于重复调用第二个查询。查询计划器是否无法处理此问题 编辑:澄清我的测试数据: 我使用的是我生成的假测试数据。我最初使用了几个字段,并

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

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

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

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

这看起来可能与你的行为有关。但是,由于
GROUPBY
子句,顶部查询相当于重复调用第二个查询。查询计划器是否无法处理此问题

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

我使用的是我生成的假测试数据。我最初使用了几个字段,并尝试获取一个月的小时总结(
按小时分组
,其中小时是使用查询的
选择
部分中的
作为
定义的)。失败后,我试着改用每日。当这失败时,我减少了所涉及的列。当使用
计数(不同的xxx,1000000)
时,这也失败了,但当我只做了一天的值时,它就起作用了。(如果我删除
1000000
参数,它也会起作用,但由于这确实适用于一天查询,因此查询计划器似乎没有像我预期的那样将事情分开。)


检查
count(distinct)
的列的基数为16000,group by列的基数为2和20,总共只有1200行。列值非常短,大约10个字符

你预计会有多少结果?目前,允许的结果总大小限制在64MB左右。如果预期结果是数百万行,那么这可能是一个预期错误

如果结果的数量不是非常大,可能是尺寸问题不是最终响应,而是内部计算。特别是,如果GROUP BY中的结果太多,则查询可能会耗尽内存。一种可能的解决方案是将“groupby”更改为“goupeach 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

你预计会有多少结果?目前,允许的结果总大小限制在64MB左右。如果预期结果是数百万行,那么这可能是一个预期错误

如果结果的数量不是非常大,可能是尺寸问题不是最终响应,而是内部计算。特别是,如果GROUP BY中的结果太多,则查询可能会耗尽内存。一种可能的解决方案是将“groupby”更改为“goupeach 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

谢谢你的回答;我把更多关于我的数据的细节放上去了,我注意到(对不起!)我没有把最大精确计数提高到distinct。我尝试按
分组,但由于其中一个分组列来自
as
选择utc_usec_to_day(time)as day
),因此出现错误
错误:查询中使用了字段day,但找不到。
问题可能是内存问题。当您使用count(distinct xxx,1000000)时,这意味着执行引擎必须为每个groupby结果跟踪多达100000个条目。因此,如果您有1200个预期行,则需要在计算树的根目录中分配1.2*10^9值的存储。我已更新了我的答案,以解释我认为每个组可以如何为您工作。感谢您的回答;我把更多关于我的数据的细节放上去了,我注意到(对不起!)我没有把最大精确计数提高到distinct。我尝试按
分组,但由于其中一个分组列来自
as
选择utc_usec_to_day(time)as day
),因此出现错误
错误:查询中使用了字段day,但找不到。
问题可能是内存问题。当您使用count(distinct xxx,1000000)时,这意味着执行引擎必须为每个groupby结果跟踪多达100000个条目。因此,如果您有1200个预期行,则需要在计算树的根中分配1.2*10^9值的存储。我已更新了我的答案,以解释我认为每个分组可以如何为您工作。
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