我正在构建一个基于BigQuery的数据模式,它将检查源IP地址是否在声明的IP地址起始/结束范围内。要处理此问题,我将把源IP地址和起始/结束范围值转换为数字。
我可以看到用于将IPV4转换为数字的BigQuery NET函数,但我找不到与IPV6等效的函数
有什么建议吗?
发布于 2021-08-27 14:58:22
根据BigQuery的文档,没有NET函数的等价物来将IPV6地址转换为数字。但是,在BigQuery中,您可以根据需要用遗留的JavaScript查询语法编写SQL。
您可以使用Javascript将此thread用于自定义项。我尝试了该代码,它正在将IPV6地址转换为数字。
代码:
CREATE TEMP FUNCTION ipv6_to_number(ip STRING)
RETURNS STRING
LANGUAGE js AS """
var parts = [];
ip.split(":").forEach(function(it) {
var bin = parseInt(it, 16).toString(2);
while (bin.length < 16) {
bin = "0" + bin;
}
parts.push(bin);
})
var bin = parts.join("");
var dec = BigInt("0b"+ bin)
return dec;
""";
Select "2020:0db9:0:0:8e3:0:0:0" ip, ipv6_to_number("2020:0db9:0:0:8e3:0:0:0") number输出:

根据您的要求,您希望返回类型为Integer。我创建了一个逻辑,其中数据类型作为BigInt返回。
代码:
ip="2020:0db9:0:0:8e3:0:0:0";
const parts=[];
const arr=ip.split(":");
const data=arr.forEach(function(it){
var bin=parseInt(it,16).toString(2);
while(bin.length<16){
bin="0"+bin;
var bin1=parseInt(bin);
}
parts.push(bin1);
});
var bin1=parts.join("");
var dec=BigInt("0b"+bin1);
console.log(dec);
console.log(typeof dec);输出:
4415686854424n
bigint在UDF中使用此函数时,Bigquery会抛出一个错误:

这是因为IPv6使用128位地址,即16字节。BigQuery中没有足够大的数字data type来容纳IPv6地址的数字形式。BigQuery支持INT64数据类型,即8字节。
您需要考虑使用字节来保存IPv6地址,或者您可以在您的UDF中使用返回类型作为字符串。
压缩IPv6地址的:
对于像“2001:0db8::0001”,“2001:4ca0:6fff::”这样的压缩IPv6地址,您可以参考以下步骤:
步骤1:预处理IPv6地址(从压缩的地址展开地址)
您可以参考以下代码:
ipdeocde.js
ipval="2001:4ca0:6fff::";
var ip = require('ipaddr.js');
var addr = ip.parse(ipval);
addr.toString();
var ipadd =addr.toNormalizedString();
console.log(ipadd);
console.log(typeof ipadd);输出:
2001:4ca0:6fff:0:0:0:0:0
String步骤2:运行UDF
在展开Ipv6地址之后,您可以在BigQuery中使用上面的UDF将IPv6地址转换为数字。
如果地址已经是扩展格式,则可以直接使用BigQuery中的自定义定义文件;如果地址是压缩格式,则首先需要对其进行处理以将地址转换为扩展格式,然后在扩展的IPv6地址上运行BigQuery中的自定义定义文件。
https://stackoverflow.com/questions/68936619
复制相似问题