如何从 bigquery 中的另一个表中获取短语列表的表字段中的匹配计数?

Posted

技术标签:

【中文标题】如何从 bigquery 中的另一个表中获取短语列表的表字段中的匹配计数?【英文标题】:How to get count of matches in field of table for list of phrases from another table in bigquery? 【发布时间】:2019-03-07 19:08:46 【问题描述】:

给定短语phrase1、phrase2*、...phraseN的任意列表(假设这些在另一个表Phrase_Table中),如何获得bigquery表中字段F中每个短语的匹配计数?

这里,“*”表示短语后面必须有一些非空/非空白字符串。

假设您有一个带有 ID 字段的表和两个字符串字段 Field1、Field2

输出看起来像

id、CountOfPhrase1InField1、CountOfPhrase2InField1、CountOfPhrase1InField2、CountOfPhrase2InField2

或者我猜可能只有一个 json 对象字段,而不是所有这些输出字段

id, ["fieldName": Field1, "counts": phrase1: m,phrase2: mm, ..., "fieldName": Field2, "counts": phrase1: m2,phrase2: mm2, ...,...]

谢谢!

【问题讨论】:

【参考方案1】:

以下示例适用于 BigQuery 标准 SQL

#standardSQL
WITH `project.dataset.table` AS (
SELECT 'foo1 foo foo40' str UNION ALL
SELECT 'test1 test test2 test'
), `project.dataset.keywords` AS (
  SELECT 'foo' key UNION ALL
  SELECT 'test'
)
SELECT str, ARRAY_AGG(STRUCT(key, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]'))) as matches)) all_matches
FROM `project.dataset.table` 
CROSS JOIN `project.dataset.keywords`
GROUP BY str

结果

Row str                     all_matches.key all_matches.matches  
1   foo1 foo foo40          foo             2    
                            test            0    
2   test1 test test2 test   foo             0    
                            test            2    

如果您更喜欢以 json 格式输出,您可以添加 TO_JSON_STRING(),如下例所示

#standardSQL
WITH `project.dataset.table` AS (
SELECT 'foo1 foo foo40' str UNION ALL
SELECT 'test1 test test2 test'
), `project.dataset.keywords` AS (
  SELECT 'foo' key UNION ALL
  SELECT 'test'
)
SELECT str, TO_JSON_STRING(ARRAY_AGG(STRUCT(key, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]'))) as matches))) all_matches
FROM `project.dataset.table` 
CROSS JOIN `project.dataset.keywords`
GROUP BY str

有输出

Row str                     all_matches  
1   foo1 foo foo40          ["key":"foo","matches":2,"key":"test","matches":0]   
2   test1 test test2 test   ["key":"foo","matches":0,"key":"test","matches":2]     

有无数种方式可以像上面那样呈现输出 - 希望你能将它调整到你需要的任何东西:o)

【讨论】:

以上是关于如何从 bigquery 中的另一个表中获取短语列表的表字段中的匹配计数?的主要内容,如果未能解决你的问题,请参考以下文章

如果一个数组包含使用 BigQuery 的另一个数组的所有值,我如何过滤行?

如何从 Mysql 中的另一个表向表中添加列?

如何在 BigQuery 上展开数组以将列添加到现有表

有没有办法从 BigQuery 的表中获取所有列的不同值?

如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除

转换后将数据从一列复制到同一表中的另一列