优化 BigQuery 中的查询

Posted

技术标签:

【中文标题】优化 BigQuery 中的查询【英文标题】:Optimize query in BigQuery 【发布时间】:2015-10-22 11:35:53 【问题描述】:

我正在尝试在 BigQuery 中运行查询,但收到“查询执行期间超出资源”。

其实我有两张桌子:

Table user:
Id  | User   | Latitude  | Longitude
1   | 1      |  50.83    |  4.01
2   | 1      |  50.84    |  4.03
3   | 2      |  48.78    |  2.87
4   | 3      |  47.42    |  8.53
…
Table point_of_interest:
Id  | Latitude  | Longitude | Range   |  Tag  
1   |  50.81    |  3.98     |  0.05   |  a;b;c;d
2   |  50.85    |  4.03     |  0.025  |  a;c;e;f
3   |  40.80    |  3.87     |  0.04   |  a;d;g
4   |  47.42    |  8.57     |  0.08   |  b
…

目的是加入表格以用纬度、经度和范围标记所有用户。

为此,我使用了该查询:

SELECT
  u.User AS id,
  GROUP_CONCAT(poi.Tag) AS tag
FROM (
  SELECT
    u.User,
    poi.Tag,
  FROM
    [user] u
  CROSS JOIN
    [point_of_interest] poi
  WHERE
    u.Latitude BETWEEN poi.Latitude – poi.Range AND poi.Latitude + poi.Range
    AND
    u.Longitude BETWEEN poi.Longitude – poi.Range AND poi.Longitude + poi.Range )
GROUP BY
  id

user 表当前为 520 MB,point_of_interest 表只有 565 KB,但可能会随着时间的推移而增长。

我想知道是否有更好的方法来实现这一目标,以及实现这一目标的最佳架构。

编辑:

我也尝试使用LEFT JOIN EACH 范围,但 BigQuery 仅支持 ON 关键字之后的相等语句。

【问题讨论】:

重要的不是大小,而是记录的数量。每张表有多少条记录? 您尝试过GROUP EACH BY 是否仍然超出资源? 我尝试了 GROUP EACH BY,但我得到了同样的错误。 user 表包含 3 000 000 条记录,point_of_interest 表包含 100 000 条记录。 所以使用交叉连接,加入单个节点需要 3000 亿,巨大! 【参考方案1】:

您需要对表进行分片并运行多个较小的查询。

类似这样的:

SELECT * FROM table WHERE ABS(HASH(id) % 100) == 0
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 1
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 2
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 3
...
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 99

但是您需要找到一个合适的高数字,而不是像我的示例中的 100,然后编写一段代码来为您自动执行此操作。首先手动尝试一个分片,分片中有相当多的记录。

您可以将结果WRITE_APPEND 到同一个目标表中,并与原始数据分开存储。

【讨论】:

【参考方案2】:

对于一个类似的问题,我通过为每一行生成键来优化它,以避免在整个数据集上交叉连接。

http://googlecloudplatform.blogspot.com/2014/03/geoip-geolocation-with-google-bigquery.html

堆栈O:How to improve performance of GeoIP query in BigQuery?

顺便说一句,这个问题与后来发布的问题(Tag huge list of elements with lat/long with large list of geolocation data)有关吗?

【讨论】:

以上是关于优化 BigQuery 中的查询的主要内容,如果未能解决你的问题,请参考以下文章

dbt - jinja - bigquery - 查询优化

BigQuery 中的分区如何工作?

BigQuery - 集群表不使用多个键减少查询大小

优化繁重的 BigQuery DELETE 查询

Google BigQuery 优化策略

使用 Google BigQuery 上的开始/结束日期优化活动帐户查询