Sql 查询超出了Bigquery中的资源限制
为了找到特定IP地址的国家,我使用Maxmind IP地址数据库。我已经下载了数据库并将其导入到GoogleBigQuery中,所以我可以查询它。在一个单独的表中,我从系统中的某些事件捕获IP地址。我现在想加入这两个数据源 Maxmind数据库中的列如下所示:Sql 查询超出了Bigquery中的资源限制,sql,google-bigquery,Sql,Google Bigquery,为了找到特定IP地址的国家,我使用Maxmind IP地址数据库。我已经下载了数据库并将其导入到GoogleBigQuery中,所以我可以查询它。在一个单独的表中,我从系统中的某些事件捕获IP地址。我现在想加入这两个数据源 Maxmind数据库中的列如下所示: 起始\u ip\u范围字符串可为空 end_ip_范围字符串可为空 开始\u ip\u num字符串可为空 end_ip_num字符串可为空 国家/地区代码字符串可为空 国名 “我的事件”表中的列包括: 请求id字符串可为空 ip_
- 起始\u ip\u范围字符串可为空
- end_ip_范围字符串可为空
- 开始\u ip\u num字符串可为空
- end_ip_num字符串可为空
- 国家/地区代码字符串可为空
- 国名
- 请求id字符串可为空
- 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)
因此,您将
dev.event\u v1
中的所有内容与dev.geo\u ip\u countries
连接,以获得dev.geo\u ip\u countries.country\u code>中每一行的dev.event\u v1
。我想你会对左撇子感兴趣的
您可能对测试中的转换是否可以替换您的数学部分感兴趣
我对事件v1请求或ip地址的内容了解不多,但我敢打赌那里的行数要比地理ip国家的行数多得多。这可能是你大部分的查询时间。假设您需要将该时间减少约6倍。您可能应该选择其中的第6个来加入并插入到暂存表中,然后按顺序重复接下来的6个步骤
我认为使用(6)
会对你有所帮助;可能超过(前面的行没有限制)作为nt
,不确定。然后在where或join on子句中使用nt=1
。尝试以下操作(BigQuery标准SQL)
不幸的是,上述方法并没有解决我所遇到的计算量大的问题。查询处理的最大部分实际上是在计算ip地址的数值时完成的。现在已经使用了BigQuery中的NET函数(来自已接受的答案)。不过非常感谢!
#standardSQL
SELECT
p.* EXCEPT(ip_address_num),
g.country_code AS country_code
FROM (
SELECT *,
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) ip_address_num
FROM `dev.event_v1`
) p
INNER JOIN (
SELECT
SAFE_CAST(g.start_ip_num AS INT64) start_ip_num,
SAFE_CAST(g.end_ip_num AS INT64) end_ip_num,
country_code
FROM `dev.geo_ip_countries`
) g
ON ip_address_num BETWEEN g.start_ip_num AND g.end_ip_num