【发布时间】:2018-08-22 07:32:50
【问题描述】:
为了查找特定 IP 地址的国家/地区,我使用了 Maxmind IP 地址数据库。我已经下载了数据库并将其导入到 Google BigQuery 中,所以我可以查询它。在一个单独的表中,我正在从我们系统中的某些事件中捕获 IP 地址。我现在想加入这两个数据源。
Maxmind数据库中的列如下:
- start_ip_range STRING NULLABLE
- end_ip_range STRING NULLABLE
- start_ip_num STRING NULLABLE
- end_ip_num STRING NULLABLE
- country_code STRING NULLABLE
- 国家/地区名称
我的事件表中的列是:
- request_id STRING NULLABLE
- ip_address STRING NULLABLE
正如此处 (https://dev.maxmind.com/geoip/legacy/csv/) 所述,有一种方法可以获取 IP 地址的整数表示,因此我可以使用它来查询 IP 地址并检索国家代码或国家名称。
我现在已经构建了以下查询:
SELECT
p.*,
g.country_code AS country_code
FROM
`dev.event_v1` p
INNER JOIN
`dev.geo_ip_countries` g
ON
SAFE_CAST(SPLIT(p.ip_address, ".")[OFFSET(0)] AS NUMERIC)*16777216 +
SAFE_CAST(SPLIT(p.ip_address, ".")[OFFSET(1)] AS NUMERIC)*65536 +
SAFE_CAST(SPLIT(p.ip_address, ".")[OFFSET(2)] AS NUMERIC)*256 +
SAFE_CAST(SPLIT(p.ip_address, ".")[OFFSET(3)] AS NUMERIC)
BETWEEN
SAFE_CAST(g.start_ip_num AS INT64)
AND
SAFE_CAST(g.end_ip_num AS INT64)
LIMIT 100
然而,这在使用限制时有效,但不适用于构建视图。
两个问题: 1.有没有办法简化查询 2.当我尝试返回一个大的结果集时,Google BigQuery 会抛出一个错误:
Error: Query exceeded resource limits. 28099.974050246612 CPU seconds were used, and this query must use less than 5600.0 CPU seconds.
感谢任何帮助!
解决方案 将查询重写为以下内容也可以解决资源限制问题:
SELECT
p.*,
g.country_code
FROM
`dev.event_v1` p
INNER JOIN
`dev.geo_ip_countries` g
ON
NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(p.ip_address),16) = NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(g.start_ip_range),16)
WHERE
NET.SAFE_IP_FROM_STRING(p.ip_address)
BETWEEN
NET.SAFE_IP_FROM_STRING(g.start_ip_range)
AND
NET.SAFE_IP_FROM_STRING(g.end_ip_range)
【问题讨论】:
标签: sql google-bigquery