从 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的主要内容,如果未能解决你的问题,请参考以下文章

IP地址国家/地区查找服务[关闭]

为相同的前 16 位 IP 地址假设统一的地理 IP 分辨率是不是安全?

如何在大查询中使用 ST_CONTAINS 加入地理列

域名查询IP及公网IP地址地理位置查询

如何使用带有 nodejs 的 bigquery 插入方法插入地理类型数据

python查询公网IP地址、IP地理位置