[英]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.