Geolocation geolite_city_bq_b2数据集的精度

Geolocation geolite_city_bq_b2数据集的精度,geolocation,google-bigquery,geolitecity,Geolocation,Google Bigquery,Geolitecity,我相信BigQueryfh BigQuery.geocode.geolite\u city\u bq\u b2数据集中存在不准确之处,我很好奇其他人是否也注意到了这一点 背景:我运行了BigQuery代码,他/我的逻辑看起来很合理。然而,已知有IP地址代表某些地方,例如东京@150.249.199.17,但Ramtin的查询表明这些地址位于美国纽约州罗切斯特或加利福尼亚州渥太华。如果查询逻辑正确,则唯一的结论是,基础Geolite数据集不正确 要进行验证,请查看此查询的结果: SELECT *

我相信BigQuery
fh BigQuery.geocode.geolite\u city\u bq\u b2
数据集中存在不准确之处,我很好奇其他人是否也注意到了这一点

背景:我运行了BigQuery代码,他/我的逻辑看起来很合理。然而,已知有IP地址代表某些地方,例如东京@150.249.199.17,但Ramtin的查询表明这些地址位于美国纽约州罗切斯特或加利福尼亚州渥太华。如果查询逻辑正确,则唯一的结论是,基础Geolite数据集不正确

要进行验证,请查看此查询的结果:

SELECT *
FROM `fh-bigquery.geocode.geolite_city_bq_b2b`
WHERE classB = 38649
从这些结果中注意到
startIp
=150.245.0.0和
endIp
=150.249.255.255,因此地址150.249.199.17在此IP范围内

现在与来自的结果进行比较,并与来自以下BigQuery的结果进行比较。请注意,所有计算值(如IP地址的IPV4_到_INT64())都在上述查询返回的范围内

SELECT '150.249.199.17' as ipAddress
  , NET.IPV4_TO_INT64(NET.IP_FROM_STRING('150.249.199.17')) AS clientIpNum_int
  , TRUNC(NET.IPV4_TO_INT64(NET.IP_FROM_STRING('150.249.199.17'))/(256*256)) AS classB
  , CAST(TRUNC(NET.IPV4_TO_INT64(NET.IP_FROM_STRING('150.249.199.17'))/(256*256)) as INT64) as client_classB_int

p、 我会对第一个答案投赞成票,或者添加评论,但我还没有足够的声望

2019年,答案有了很大改善:


我将在BigQuery中发布一个改进了很多的Geolite版本。请继续收看和收看。然后我也会更新这个答案

话虽如此,为了回答这个问题的准确性部分,Maxmind说:

GeoLite2数据库是免费IP地理定位数据库,与MaxMind的GeoIP2数据库相当,但精确度较低


下面更新了答案!
#standardSQL
# replace with your source of IP addresses
# here I'm using the same Wikipedia set from the previous article
WITH source_of_ip_addresses AS (
  SELECT REGEXP_REPLACE(contributor_ip, 'xxx', '0')  ip, COUNT(*) c
  FROM `publicdata.samples.wikipedia`
  WHERE contributor_ip IS NOT null  
  GROUP BY 1
)
SELECT country_name, SUM(c) c
FROM (
  SELECT ip, country_name, c
  FROM (
    SELECT *, NET.SAFE_IP_FROM_STRING(ip) & NET.IP_NET_MASK(4, mask) network_bin
    FROM source_of_ip_addresses, UNNEST(GENERATE_ARRAY(9,32)) mask
    WHERE BYTE_LENGTH(NET.SAFE_IP_FROM_STRING(ip)) = 4
  )
  JOIN `fh-bigquery.geocode.201806_geolite2_city_ipv4_locs`  
  USING (network_bin, mask)
)
GROUP BY 1
ORDER BY 2 DESC