Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询超出了Bigquery中的资源限制_Sql_Google Bigquery - Fatal编程技术网

Sql 查询超出了Bigquery中的资源限制

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_

为了找到特定IP地址的国家,我使用Maxmind IP地址数据库。我已经下载了数据库并将其导入到GoogleBigQuery中,所以我可以查询它。在一个单独的表中,我从系统中的某些事件捕获IP地址。我现在想加入这两个数据源

Maxmind数据库中的列如下所示:

  • 起始\u ip\u范围字符串可为空
  • end_ip_范围字符串可为空
  • 开始\u ip\u num字符串可为空
  • end_ip_num字符串可为空
  • 国家/地区代码字符串可为空
  • 国名
“我的事件”表中的列包括:

  • 请求id字符串可为空
  • ip_地址字符串可为空
如本文()所述,有一种方法可以获取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)

因此,您将
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