谷歌BigQuery分组包含关键字

时间:2016-02-24 19:47:52

标签: google-bigquery

给出一个示例数据集,我试图进行排序:

email,domain_name
name1@email.com,superlorem.com
name2@email.com,superdolor.com
name3@email.com,superamet.com
name4@email.com,badlorem.com
name5@email.com,baddolor.com
name6@email.com,badamet.com

我开始使用诸如......之类的查询     选择电子邮件     从表     哪里         (domain_name包含' dolor')或         (domain_name包含' sit')或         (domain_name包含' amet')     GROUP BY电子邮件

是否可以按"包含"对结果进行分组。单词,例如' dolor',' sit'和' amet'?单词本身不会存在于列中(例如,作为域名的一部分,例如superlipsum.com)。我的最终目标是拥有一个类似于此的CSV:

Dolor,column1
Dolor,column2
Dolor,column3
Sit,column4
Sit,column5
Sit,column6
Sit,column7    
Amet,column8

2 个答案:

答案 0 :(得分:0)

你需要单独的表格,其中包含所有单词(dolor,sit,amet等) 然后,下面应该工作

SELECT 
  word,
  email
FROM yourTable AS t1
CROSS JOIN wordsTable AS t2
WHERE domain_name CONTAINS word
ORDER BY word, email  

如果您的单词列表有限 - 您可以使用以下(动态)版本

SELECT 
  word,
  email
FROM yourTable AS t1
CROSS JOIN (
  SELECT f0_ AS word FROM
  (SELECT 'dolor'),
  (SELECT 'sit'),
  (SELECT 'amet')
) AS t2
WHERE domain_name CONTAINS word
ORDER BY word, email  

两者都会产生类似下面的内容

word    email    
amet    name3@email.com  
amet    name6@email.com  
dolor   name2@email.com  
dolor   name5@email.com  

答案 1 :(得分:0)

另一种选择是使用正则表达式,即

SELECT 
 regexp_extract(domain_name, r'(dolor|sit|amet)' word,
 email, 
FROM table

BigQuery将为正则表达式编译自动机一次,并将有效地将其应用于所有行。我希望这能比JOIN提供更好的性能。