首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigQuery是否将IPV4和IPV6转换为数字以允许起始IP地址范围和结束IP地址范围匹配?

BigQuery是否将IPV4和IPV6转换为数字以允许起始IP地址范围和结束IP地址范围匹配?
EN

Stack Overflow用户
提问于 2021-08-26 10:12:36
回答 1查看 301关注 0票数 1

我正在构建一个基于BigQuery的数据模式,它将检查源IP地址是否在声明的IP地址起始/结束范围内。要处理此问题,我将把源IP地址和起始/结束范围值转换为数字。

我可以看到用于将IPV4转换为数字的BigQuery NET函数,但我找不到与IPV6等效的函数

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2021-08-27 14:58:22

根据BigQuery的文档,没有NET函数的等价物来将IPV6地址转换为数字。但是,在BigQuery中,您可以根据需要用遗留的JavaScript查询语法编写SQL。

您可以使用Javascript将此thread用于自定义项。我尝试了该代码,它正在将IPV6地址转换为数字。

代码:

代码语言:javascript
复制
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返回。

代码:

代码语言:javascript
复制
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);

输出:

代码语言:javascript
复制
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

代码语言:javascript
复制
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);

输出:

代码语言:javascript
复制
2001:4ca0:6fff:0:0:0:0:0
String

步骤2:运行UDF

在展开Ipv6地址之后,您可以在BigQuery中使用上面的UDF将IPv6地址转换为数字。

如果地址已经是扩展格式,则可以直接使用BigQuery中的自定义定义文件;如果地址是压缩格式,则首先需要对其进行处理以将地址转换为扩展格式,然后在扩展的IPv6地址上运行BigQuery中的自定义定义文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68936619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档