繁体   English   中英

如何在 Bigquery 中使用交叉连接优化重复的正则表达式

[英]How to optimize repeated regex using cross join in Bigquery

我有大约 2000 万行文本数据,并希望基于几个关键字(大约 100k 个关键字)对其进行 label。 我的文本数据是这样的

文本
我的车坏了
没人知道
这条鱼真漂亮

虽然关键字看起来像这样

关键词
美丽的
知道
旅行

我预期的 output 看起来像这样,我将在其中使用关键字数据对文本列进行正则表达式。

文本 关键词
我的车坏了
没人知道 知道
这条鱼真漂亮 美丽的

我在这篇文章的解决方案中使用正则表达式 但是,由于我的数据非常庞大(20mio x 100k 关键字),它运行的时间很长,就像永远一样。 那么,我想问的是,有没有更好的解决办法呢?

无论如何,这里是我使用的查询:

 select 'my car was broken' as text
 union all
 select 'nobody knows'
 union all
 select 'the fish is so beautiful'
 )
 ,raw_keywords as(
  select 'car' as keyword
  union all
  select 'beautiful'
  union all
  select 'know'
  union all
  select 'journey'
  )
  SELECT  text, keyword
    FROM raw_text, raw_keywords 
    WHERE REGEXP_CONTAINS(text, keyword) 

我无法使用大数据集进行测试,但解决方案可以是:

  • 提取所有单词并保存在临时表中(使用聚簇提高连接性能)
  • 将此临时表与键盘表连接起来

所以这是代码:

首先创建临时表:

create table word_text(
    word STRING,
    text STRING
)
CLUSTER BY word
;

填充它(这里我没有用大量数据进行测试,所以这一步可能会有点长)

insert into word_text
-- Transform array to rows
select word, text from(
    -- Transform text to array
    select split(text, ' ') as words, text from (
        select 'my car was broken' as text
        union all
        select 'nobody knows'
        union all
        select 'the fish is so beautiful'
    )
 ),
UNNEST(words) word   

在此处输入图像描述

交叉数据:

SELECT word_text.text, raw_keywords.keyword
FROM word_text, raw_keywords 
WHERE word_text.word = raw_keywords.keyword 

以下查询返回您想要将文本拆分为单词并在关键字表上执行INNER JOIN的内容,而无需创建新表。

WITH splited AS (
  SELECT SPLIT(text, ' ') AS text_split, text FROM project.dataset.text_tab 
)

SELECT text, keyword
FROM (
  SELECT text, word_inside FROM splited, UNNEST(text_split) AS word_inside
)
INNER JOIN
  `project.dataset.keywords`
ON
  keyword = word_inside;
  • 表:

在此处输入图像描述 在此处输入图像描述

  • 结果:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM