从 bigquery 开放数据库查询 IP 地理位置数据:geolite2
Posted
技术标签:
【中文标题】从 bigquery 开放数据库查询 IP 地理位置数据:geolite2【英文标题】:Query IP geo-location data from bigquery open database: geolite2 【发布时间】:2019-10-30 04:08:52 【问题描述】:我可以使用什么查询从the bigquery open database: geolite2 获取长度 >= 1 的 IP 数组的地理位置数据。该数组是在 golang 程序中定义的。 我得到的错误是:IP 未在 [11:77] 定义
type IPValue struct
IP string
func main()
ctx := context.Background()
client, err := bigquery.NewClient(ctx, "project")
if err != nil
panic(err)
q := client.Query(`
WITH source_of_ip_addresses AS (
SELECT @IPS as IPs
)
SELECT city_name
FROM (
SELECT ip, city_name, c, latitude, longitude, geoname_id
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)
)
`)
q.DisableQueryCache = false
q.Parameters = []bigquery.QueryParameter
Name: "IPS",
Value: []IPValue
IP: "75.x.y.z",
,
,
,
runErr := runAndRead(ctx, q)
log.Println(runErr)
【问题讨论】:
请说明您迄今为止尝试过的策略以及您面临的问题。 我已经编辑了问题 看起来像一个错字 - 您的列名称是IPs
,而不是 SELECT @IPS as IPs
中的 IP
,但是您在 NET.SAFE_IP_FROM_STRING(IP)
中使用名称 IP
。
【参考方案1】:
退房:
https://towardsdatascience.com/geolocation-with-bigquery-de-identify-76-million-ip-addresses-in-20-seconds-e9e652480bd2查询:
#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
Query complete (20.9 seconds elapsed, 1.14 GB processed)
【讨论】:
我已经用我的代码的样子更新了我的问题。我收到错误:无法识别的名称为 [11:77]。请帮我调试 您能否按照已发布的方式运行我的查询?请先尝试一下 是的,我是。非常令人印象深刻;花了 17 秒 酷!所以现在我们必须调试您粘贴的代码......也许为此发布一个新问题? (因为这里回答了最初的问题......现在你完全改变了它) 我将保持原样。这个答案帮助我从没有代码到有一些代码,因此仍然有效。此外,任何想要查看问题历史记录的人都可以进行编辑。我还提到我的初衷是用 golang 来做这件事,这并没有改变以上是关于从 bigquery 开放数据库查询 IP 地理位置数据:geolite2的主要内容,如果未能解决你的问题,请参考以下文章
为相同的前 16 位 IP 地址假设统一的地理 IP 分辨率是不是安全?