从BigQuery表中查询域后缀

时间:2014-01-14 05:50:19

标签: sql google-bigquery

我正在尝试从我的网站表中获取域名后缀,但是,BigQuery中没有反向功能,我的域名包含example.example.com等域名。因此,我无法设置'。'的第1 /第3个外观。因为“。”的数量不一致。

SELECT
  SUBSTR(Domain,( INSTR(Domain,'.')+1)) AS user_tld,
  COUNT(*) AS activity_count
FROM [table]
GROUP EACH BY
  user_tld
  HAVING
  user_tld IS NOT NULL AND NOT user_tld 
  IN ('')
  ORDER BY 
  user_tld DESC
  LIMIT 250;

这是我目前所处的位置,只能在第一个'。'之后列出整个域名或域名。

2 个答案:

答案 0 :(得分:1)

  1. BQ有一些很棒的网址功能:https://developers.google.com/bigquery/query-reference?#urlfunctions
  2. 如果这不起作用,请尝试使用regexp_extract而不是substring,您可以在其中定义字符串的确切字符串结构,并根据需要将其定义为匹配字符串end。

答案 1 :(得分:0)

user2881671所述,您可以使用TLD()函数:

SELECT TLD('http://' + req_host), COUNT(*) c
FROM [httparchive:runs.2014_01_01_requests]
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1000

17130999    .com     
3106860     .net     
894779      .ru  
538917      .de  
504799      .org     
252716      .jp  
247244      .com.br  
225529      .fr  
218345      .pl  
206532      .co.uk  

请注意,TLD()足够“足够聪明”来识别TLD是'.co.uk'而不是'.uk'。

如果你只想要'.uk'部分,正则表达式也很好:

SELECT COUNT(*) c, REGEXP_EXTRACT(req_host, r'(\.[^.:]*)\.?:?[0-9]*$')
FROM [httparchive:runs.2014_01_01_requests]
GROUP BY 2
ORDER BY 1 DESC
LIMIT 1000;

17130999    .com     
3106860     .net     
903360      .ru  
539167      .de  
504799      .org     
491532      .jp  
276205      .br  
258811      .cn  
237798      .pl  
230407      .fr