Timezone 如何在BigQuery标准SQL中将IP地址转换为地理位置?

Timezone 如何在BigQuery标准SQL中将IP地址转换为地理位置?,timezone,google-bigquery,geoip,ip-geolocation,bigquery-standard-sql,Timezone,Google Bigquery,Geoip,Ip Geolocation,Bigquery Standard Sql,所以我读过 但我想知道是否有一种标准的SQL方法可以做到这一点。到目前为止,我在转换PARSE_IP和NTH时遇到了很多挑战,因为迁移文档中建议的更改具有局限性 从PARSE_IPcontributor_ip到NET.IPV4_到_INT64NET.SAFE_ip_从_STRINGcontributor_ip不适用于IPv6 ip地址 从NTH1开始,纬度lat到纬度[SAFE_ORDINAL1]不起作用,因为纬度被认为是一个字符串 我可能还没有遇到更多的迁移问题。有人知道如何在BigQuery

所以我读过

但我想知道是否有一种标准的SQL方法可以做到这一点。到目前为止,我在转换PARSE_IP和NTH时遇到了很多挑战,因为迁移文档中建议的更改具有局限性

从PARSE_IPcontributor_ip到NET.IPV4_到_INT64NET.SAFE_ip_从_STRINGcontributor_ip不适用于IPv6 ip地址

从NTH1开始,纬度lat到纬度[SAFE_ORDINAL1]不起作用,因为纬度被认为是一个字符串

我可能还没有遇到更多的迁移问题。有人知道如何在BigQuery标准SQL中将IP地址转换为地理位置吗

顺便问一下,我如何从地理位置确定时区

编辑:那么这两者之间有什么区别呢

#legacySQL
SELECT
  COUNT(*) c,
  city,
  countryLabel,
  NTH(1, latitude) lat,
  NTH(1, longitude) lng
FROM (
  SELECT
    INTEGER(PARSE_IP(contributor_ip)) AS clientIpNum,
    INTEGER(PARSE_IP(contributor_ip)/(256*256)) AS classB
  FROM
    [publicdata:samples.wikipedia]
  WHERE
    contributor_ip IS NOT NULL ) AS a
JOIN EACH
  [fh-bigquery:geocode.geolite_city_bq_b2b] AS b
ON
  a.classB = b.classB
WHERE
  a.clientIpNum BETWEEN b.startIpNum
  AND b.endIpNum
  AND city != ''
GROUP BY
  city,
  countryLabel
ORDER BY
  1 DESC

edit2:我似乎通过不正确地铸造浮球来解决问题。现在,标准SQL返回41815行,而不是传统SQL中的56347行,这可能是由于标准SQL缺少从IPv6到int的转换,但可能是由于其他原因。此外,传统SQL查询的性能要好得多,运行时间约为10秒,而不是标准SQL的整分钟


n是arr[OFFSET0]的模拟值。如果没有数组,则不需要使用序数或偏移量。您可以使用长度筛选IP。。。如果您只需要IPv4。错误:StringType的值不支持使用[]进行元素访问。我的意思是,您有字符串而不是数组,因此不需要使用它。您可以将其添加到group by列表或使用任何值。有关时区问题,请参阅
SELECT
  COUNT(*) c,
  city,
  countryLabel,
  ANY_VALUE(latitude) lat,
  ANY_VALUE(longitude) lng
FROM (
  SELECT
    CASE
      WHEN BYTE_LENGTH(contributor_ip) < 16 THEN SAFE_CAST(NET.IPV4_TO_INT64(NET.SAFE_IP_FROM_STRING(contributor_ip)) AS INT64)
      ELSE NULL
    END AS clientIpNum,
    CASE
      WHEN BYTE_LENGTH(contributor_ip) < 16 THEN SAFE_CAST(NET.IPV4_TO_INT64(NET.SAFE_IP_FROM_STRING(contributor_ip)) / (256*256) AS INT64) 
      ELSE NULL
    END AS classB
  FROM
    `publicdata.samples.wikipedia`
  WHERE
    contributor_ip IS NOT NULL ) AS a
JOIN
  `fh-bigquery.geocode.geolite_city_bq_b2b` AS b
ON
  a.classB = b.classB
WHERE
  a.clientIpNum BETWEEN b.startIpNum
  AND b.endIpNum
  AND city != ''
GROUP BY
  city,
  countryLabel
ORDER BY
  1 DESC
#standardSQL
SELECT
  id,
  IFNULL(city, 'Other') AS city,
  IFNULL(countryLabel, 'Other') AS countryLabel,
  latitude,
  longitude
FROM (
  SELECT
    id,
    NET.IPV4_TO_INT64(NET.IP_FROM_STRING(ip)) AS clientIpNum,
    TRUNC(NET.IPV4_TO_INT64(NET.IP_FROM_STRING(ip))/(256*256)) AS classB
  FROM
    `<project>.<dataset>.log` ) AS a
LEFT OUTER JOIN
  `fh-bigquery.geocode.geolite_city_bq_b2b` AS b
ON
  a.classB = b.classB
  AND a.clientIpNum BETWEEN b.startIpNum AND b.endIpNum
ORDER BY
  id ASC