过滤查询会导致“响应太大”错误

时间:2012-11-17 21:24:32

标签: google-bigquery

运行查询

SELECT project, test_id, log_time,
       connection_spec.client_geolocation.latitude, 
       connection_spec.client_geolocation.longitude
FROM m_lab.2012_11
GROUP BY project, test_id, log_time,
         connection_spec.client_geolocation.latitude, 
         connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6

成功~20秒

但是,为此添加WHERE子句应减少返回的行数

SELECT project, test_id, log_time,
       connection_spec.client_geolocation.latitude, 
       connection_spec.client_geolocation.longitude
FROM m_lab.2012_11
WHERE log_time > 0
GROUP BY project, test_id, log_time,
         connection_spec.client_geolocation.latitude, 
         connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6

会导致错误“响应太大而无法返回。”

我的期望是限制返回的行会增加执行时间,因为需要扫描更多行,但响应应该是相同的大小。我错过了什么?

1 个答案:

答案 0 :(得分:3)

首先,扫描的行数是不变的。 BigQuery不会对行进行索引(按设计),并在您指定的表上执行全表扫描。

在这个m-lab表中有数十亿行,我认为这里的一般问题是通过多个GROUP BY生成的唯一结果的数量在两个查询中都非常大,这会对个体产生“响应太大”错误BigQuery执行树中的节点。

一种方法:

处理此查询的一种方法是使用我们称为GROUP EACH BY的新功能。这提供了应用shuffle操作来平衡服务树上的分组。当每个GROUP'桶中有许多单个值时,它最有效。在m-lab数据集中,几乎每个条目都附加到项目“0”,因此我将从查询结果中删除它,并GROUP EACH BY其他更多的值:

SELECT test_id, log_time,  connection_spec.client_geolocation.latitude,  connection_spec.client_geolocation.longitude
FROM
  [measurement-lab:m_lab.2012_11]
WHERE
  log_time > 0 AND project = 0
GROUP EACH BY
  test_id, log_time, connection_spec.client_geolocation.latitude,   connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6;

另一种策略:

您查询列表的结果按log_time的顺序生成,这意味着您实际上只返回最早的log_time数据点。为什么不为一组时间点运行子选择,然后使用WHERE子句中的结果集运行GROUP BY。此查询应该比其他示例运行得快得多:

SELECT
  test_id, log_time, connection_spec.client_geolocation.latitude, connection_spec.client_geolocation.longitude, COUNT(*) AS entry_count      
FROM
  [measurement-lab:m_lab.2012_11]
WHERE
  project = 0 AND log_time IN
  (SELECT log_time FROM [measurement-lab:m_lab.2012_11] WHERE log_time > 0 GROUP BY log_time ORDER BY log_time LIMIT 6)
GROUP BY
  test_id, log_time, connection_spec.client_geolocation.latitude, connection_spec.client_geolocation.longitude  ORDER BY log_time, entry_count;