Разобрать IP-адрес с su bnet и вывести в таблицу - PullRequest
1 голос
/ 14 марта 2020

У меня есть таблица сопоставления IP-адресов в BigQuery, которая содержит следующие столбцы

 +---------------+-----------+------------------+
| 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   |
+---------------+-----------+------------------+

Я хочу проанализировать столбец su bnet выше, чтобы он просто отображал все IP-адреса, связанные с этим серийным номером, и имя. Так, например, Sphinx покажет несколько столбцов со списком IP-адресов в пределах этого su bnet, например ниже:

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

Цените, если кто-то может помочь показать, как код должен быть написан?

Спасибо!

1 Ответ

2 голосов
/ 14 марта 2020

Ниже для BigQuery Standard 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  

Если обратиться к образцу данных из вашего вопроса - вывод будет примерно таким:

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     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...