【问题标题】:Google BigQuery Grouping by Contains KeywordGoogle BigQuery 按包含关键字分组
【发布时间】:2016-02-25 11:47:46
【问题描述】:

给定一个我正在尝试排序的示例数据集:

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

我从一个查询开始,例如... 选择电子邮件 从表 在哪里 (域名包含“dolor”)或 (域名包含“坐”)或 (域名包含“amet”) 按电子邮件分组

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

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

【问题讨论】:

  • 您能否提供最终达到预期输出的表格数据示例
  • 糟糕,无法格式化评论,所以我将编辑帖子
  • 是 email 和 domain_name 这两个(a 和 b)列在您的问题中吗?在这种情况下,什么是“列”?
  • 感谢您的及时回复,抱歉耽搁了!我正在打电话,但尚未完成问题的编辑。

标签: google-bigquery


【解决方案1】:

您需要单独的表格,其中包含所有单词(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  

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 请注意:使用 regexp_extract 的限制是您只能对值进行硬编码,因此包含大量单词的更通用的情况将无法正常工作或根本无法工作
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多