Google bigquery 从子网解析IP地址并输出到表

Google bigquery 从子网解析IP地址并输出到表,google-bigquery,Google Bigquery,我在BigQuery中有一个IP映射表,其中包含以下列 +---------------+-----------+------------------+ | Serial number | Name | Subnet | +---------------+-----------+------------------+ | 352323992 | Eureka | 10.100.1.128/26 | | 352323993 | Batman

我在BigQuery中有一个IP映射表,其中包含以下列

 +---------------+-----------+------------------+
| Serial number |   Name    |      Subnet      |
+---------------+-----------+------------------+
|     352323992 | Eureka    | 10.100.1.128/26  |
|     352323993 | Batman    | 10.159.208.24/30 |
|     352324215 | Spiderman | 10.100.0.192/26  |
|     352324211 | Atlantis  | 10.159.208.12/30 |
|     352324259 | Oregon    | 10.100.0.0/26    |
|     352324252 | Adamar    | 10.100.1.0/26    |
|     352324254 | Osiris    | 10.159.208.0/30  |
|     352324255 | Sphinx    | 10.159.208.16/30 |
|     352324326 | Bahtera   | 10.100.0.64/26   |
+---------------+-----------+------------------+
我想解析上面的子网列,以便它只显示与序列号和名称关联的所有IP地址。例如,Sphinx将显示几个列,其中包含该子网内的IP地址列表,如下所示:

352324255 | Sphinx    | 10.159.208.16
352324255 | Sphinx    | 10.159.208.17
352324255 | Sphinx    | 10.159.208.18
352324255 | Sphinx    | 10.159.208.19
我想在BiqQuery中将该输出生成到一个表中

如果有人能帮助你展示代码应该如何编写,你会很感激吗


谢谢大家!

下面是BigQuery标准SQL

#standardSQL
CREATE TEMP FUNCTION SubnetToRange(CIDR STRING)
RETURNS STRUCT<start_IP STRING, end_IP STRING>
LANGUAGE js AS '''
  var beg = CIDR.substr(CIDR,CIDR.indexOf('/'));
  var end = beg;
  var off = (1<<(32-parseInt(CIDR.substr(CIDR.indexOf('/')+1))))-1; 
  var sub = beg.split('.').map(function(a){return parseInt(a)});
  var buf = new ArrayBuffer(4); 
  var i32 = new Uint32Array(buf);
  i32[0]  = (sub[0]<<24) + (sub[1]<<16) + (sub[2]<<8) + (sub[3]) + off;
  var end = Array.apply([],new Uint8Array(buf)).reverse().join('.');
  return {start_IP: beg, end_IP: end};
'''; 
SELECT t.*, NET.IP_TO_STRING(NET.IPV4_FROM_INT64(IP_int)) AS IP
FROM `project.dataset.table` t,
UNNEST([SubnetToRange(Subnet)]),
UNNEST(GENERATE_ARRAY(
  NET.IPV4_TO_INT64(NET.IP_FROM_STRING(start_IP)), 
  NET.IPV4_TO_INT64(NET.IP_FROM_STRING(end_IP))
)) IP_int  

非常感谢。这是有帮助的。。。为了便于我理解代码,var buf=new ArrayBuffer(4)是什么;在这方面意味着什么?4指的是什么?这有帮助吗?或者它真的对你有用O)如果它工作-考虑接受是的,它对我有用!上面的数组buffer(4)中有单词吗?:o)将检查并跟进shortlyso,Uint32Array表示32位无符号整数的数组,因此Uint32Array的字节长度应该是4的倍数(4x8=32)-希望这能回答您的问题
Row sn          name    subnet          IP   
1   352323992   Eureka  10.100.1.128/26 10.100.1.128     
2   352323992   Eureka  10.100.1.128/26 10.100.1.129     
3   352323992   Eureka  10.100.1.128/26 10.100.1.130     
4   352323992   Eureka  10.100.1.128/26 10.100.1.131     
5   352323992   Eureka  10.100.1.128/26 10.100.1.132     
...
61  352323992   Eureka  10.100.1.128/26 10.100.1.188     
62  352323992   Eureka  10.100.1.128/26 10.100.1.189     
63  352323992   Eureka  10.100.1.128/26 10.100.1.190     
64  352323992   Eureka  10.100.1.128/26 10.100.1.191     
65  352323993   Batman  10.159.208.24/30    10.159.208.24    
66  352323993   Batman  10.159.208.24/30    10.159.208.25    
67  352323993   Batman  10.159.208.24/30    10.159.208.26    
68  352323993   Batman  10.159.208.24/30    10.159.208.27    
69  352324215   Spiderman   10.100.0.192/26 10.100.0.192     
70  352324215   Spiderman   10.100.0.192/26 10.100.0.193     
71  352324215   Spiderman   10.100.0.192/26 10.100.0.194     
72  352324215   Spiderman   10.100.0.192/26 10.100.0.195     
... 
131 352324215   Spiderman   10.100.0.192/26 10.100.0.254     
132 352324215   Spiderman   10.100.0.192/26 10.100.0.255     
133 352324211   Atlantis    10.159.208.12/30    10.159.208.12    
134 352324211   Atlantis    10.159.208.12/30    10.159.208.13    
135 352324211   Atlantis    10.159.208.12/30    10.159.208.14    
136 352324211   Atlantis    10.159.208.12/30    10.159.208.15    
137 352324259   Oregon  10.100.0.0/26   10.100.0.0   
138 352324259   Oregon  10.100.0.0/26   10.100.0.1   
139 352324259   Oregon  10.100.0.0/26   10.100.0.2   
140 352324259   Oregon  10.100.0.0/26   10.100.0.3   
...
334 352324326   Bahtera 10.100.0.64/26  10.100.0.125     
335 352324326   Bahtera 10.100.0.64/26  10.100.0.126     
336 352324326   Bahtera 10.100.0.64/26  10.100.0.127