[英]Bigquery multiple join using clause
我需要獲取表中 IP 地址的 BGP AS 詳細信息,該表包含表 1 中提到的 SrcAddr 和 DstAddr
表格1
源地址 | 目標地址 | 字節 |
---|---|---|
1.1.1.1 | 8.8.8.8 | 1005 |
表 2 包含 BGP 作為編號詳細信息。
表2
IP地址 | 組織 | 網絡箱 | 面具 |
---|---|---|---|
1.1.1.0/24 | 雲焰 | asdjqowiq | 24 |
8.8.8.0/24 | 谷歌 | asdqwrqsd | 24 |
我想建立一個如下所示的決賽桌
表3
源地址 | SrcAS | 目標地址 | 遠程自治系統 | 字節 |
---|---|---|---|---|
1.1.1.1 | 雲焰 | 8.8.8.8 | 谷歌 | 1005 |
我通過參考文檔https://cloudplatform.googleblog.com/2014/03/geoip-geolocation-with-google-bigquery.html使用了以下查詢,並且能夠獲取 src_as 字段但無法解析dst_as。 有人可以幫我弄這個嗎?
WITH source_of_ip_addresses AS (
SELECT SamplerAddress, REGEXP_REPLACE(SrcAddr, 'xxx', '0') srcip, REGEXP_REPLACE(DstAddr, 'xxx', '0') dstip
FROM `fluentd.netflow_message`
WHERE SrcAddr IS NOT null
GROUP BY 1,2,3
)
SELECT *, srcip, src_as,
FROM (
SELECT srcip, network_bin, mask, autonomous_system_organization as src_as
FROM (
SELECT *, NET.SAFE_IP_FROM_STRING(source_of_ip_addresses.srcip) & NET.IP_NET_MASK(4, mask) network_bin ,
FROM source_of_ip_addresses, UNNEST(GENERATE_ARRAY(9,32)) mask
WHERE BYTE_LENGTH(NET.SAFE_IP_FROM_STRING(srcip)) = 4
)
JOIN `fluentd.asn_block_processed` USING (network_bin, mask)
只需重復相同的過程。 此外,使用 WITH 子句而不是嵌套查詢更方便,可以更簡單地重復此代碼。 像下面這樣的東西。 我顯然無權訪問您的表,因此無法檢查語法,您可能需要使用顯式列名而不是*
來刪除重復的列。
WITH source_of_ip_addresses AS (
SELECT SamplerAddress, REGEXP_REPLACE(SrcAddr, 'xxx', '0') srcip, REGEXP_REPLACE(DstAddr, 'xxx', '0') dstip
FROM `fluentd.netflow_message`
WHERE SrcAddr IS NOT null
GROUP BY 1,2,3
), source_with_masks AS (
SELECT *, NET.SAFE_IP_FROM_STRING(source_of_ip_addresses.srcip) & NET.IP_NET_MASK(4, mask) network_bin ,
FROM source_of_ip_addresses, UNNEST(GENERATE_ARRAY(9,32)) mask
WHERE BYTE_LENGTH(NET.SAFE_IP_FROM_STRING(srcip)) = 4
), source_processed AS (
SELECT *
FROM source_with_masks
JOIN `fluentd.asn_block_processed` USING (network_bin, mask)
), dest_with_masks AS (
-- same as above, with dstip instead of srcip
SELECT *, NET.SAFE_IP_FROM_STRING(source_of_ip_addresses.dstip) & NET.IP_NET_MASK(4, mask) network_bin ,
FROM source_processed, UNNEST(GENERATE_ARRAY(9,32)) mask
WHERE BYTE_LENGTH(NET.SAFE_IP_FROM_STRING(srcip)) = 4
), dest_processed AS (
SELECT *
FROM dest_with_masks
JOIN `fluentd.asn_block_processed` USING (network_bin, mask)
)
SELECT * from dest_processed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.