繁体   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