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