在BigQuery中有效加入IP范围

Ben*_*ing 2 google-bigquery

我有一个IP地址表和一个IP地址范围表(开始ip,结束ip),我想将它们合并在一起。我已经可以使用以下查询进行此项工作:

SELECT * FROM `ips` i
JOIN `ranges`  a
ON NET.SAFE_IP_FROM_STRING(i.ip) 
BETWEEN NET.SAFE_IP_FROM_STRING(a.start_ip) 
AND NET.SAFE_IP_FROM_STRING(a.end_ip)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是它的缩放比例非常差。要完成10个IP,大约需要8秒,而100个IP需要30秒,而1000个需要几分钟。我希望能够进行数千万行的操作。(我曾尝试将的输出写入NET.SAFE_IP_FROM_STRINGranges表,但这只会使速度提高10%左右,并且对缩放没有帮助)。

范围不重叠,因此对于输入表中的每一行,我希望输出表中有0或1行。A LATERAL JOIN可以让我做到这一点,并且几乎可以肯定可以加快速度,但是我不认为BigQuery支持它们。还有其他方法可以使此查询更快且可扩展吗?

Ben*_*ing 5

在查阅了Felipe的答案中链接到的https://cloudplatform.googleblog.com/2014/03/geoip-geolocation-with-google-bigquery.html上的文章后,我得以将某些东西放在一起变得非常快且可扩展真的很好 正如Felipe提到的那样,诀窍是对前缀(我使用/ 16)进行直接连接,然后使用之间进行过滤。我正在预处理范围以将大于/ 16的任何内容拆分为多个块。然后,我使用此查询覆盖该表,该查询添加了一些其他字段:

SELECT *, 
NET.SAFE_IP_FROM_STRING(start_ip) AS start_b, 
NET.SAFE_IP_FROM_STRING(end_ip) AS end_b, 
NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(start_ip), 16) as prefix
Run Code Online (Sandbox Code Playgroud)

然后,联接查询如下所示:

SELECT * FROM `ips` i
JOIN `ranges`  a
ON a.prefix = NET.IP_TRUNC(NET.SAFE_IP_FROM_STRING(i.ip), 16)
WHERE NET.SAFE_IP_FROM_STRING(i.ip) BETWEEN a.start_b AND a.end_b
Run Code Online (Sandbox Code Playgroud)

现在,在计费等级1上,将1000万个IP扩展到100万个范围只需不到30秒!