簡體   English   中英

Bigquery multiple join using 子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM