2016-10-07 44 views
1

我有150,000行数据,我试图在Google BigQuery中查询。如何搜索包含特定单词的行然后返回每个单词的计数?

Text包含各种长度的文本,我想从中查询特定关键字。

我已经得到尽可能下面的查询返回包含特定关键字(比如Facebook)的所有行:如何提高查询

1):

SELECT Text From Data.Set_1 
WHERE Text CONTAINS 'facebook' 

问题因此它会在新的列中的“文本”中返回所有关键字“脸谱”的总次数? 2)如何将这个数据放大到多个关键字(Facebook,cnn,bbc,twitter)并返回数据中每个关键字的总数(例如facebook 42,cnn 54,bbc 88,twitter 49)?

回答

0

为BigQuery的传统的SQL

SELECT 
    keyword, 
    COUNT(1) AS rows, 
    SUM(INTEGER((LENGTH(Text) - LENGTH(REPLACE(Text, keyword, '')))/LENGTH(keyword))) AS occurences 
FROM YourTable 
CROSS JOIN keywords 
WHERE Text CONTAINS keyword 
GROUP BY keyword 

实施例与

SELECT 
    keyword, 
    COUNT(1) AS rows, 
    SUM(INTEGER((LENGTH(Text) - LENGTH(REPLACE(Text, keyword, '')))/LENGTH(keyword))) AS occurences 
FROM (
    SELECT Text FROM 
    (SELECT 'facebookfacebookcnnbbccnn' AS Text), 
    (SELECT 'facebook' AS Text), 
    (SELECT 'cnn' AS Text) 
) AS words 
CROSS JOIN (
    SELECT keyword FROM 
    (SELECT 'facebook' AS keyword), 
    (SELECT 'cnn' AS keyword), 
    (SELECT 'bbc' AS keyword) 
) AS keywords 
WHERE Text CONTAINS keyword 
GROUP BY keyword 

对于大量查询标准SQL播放(见Enabling Standard SQL

SELECT 
    keyword, 
    COUNT(1) AS `rows`, 
    SUM((LENGTH(Text) - LENGTH(REPLACE(Text, keyword, '')))/LENGTH(keyword)) AS occurences 
FROM YourTable 
JOIN keywords 
ON STRPOS(Text, keyword) > 0 
GROUP BY keyword 

实施例与

+1

“Text LIKE CONCAT('%',keyword,'%')”是危险的,因为关键字可能包含需要转义的特殊字符。这也不是很高效。在这里使用更好的函数将是“STRPOS(Text,keyword)> 0” –

+0

同意,更新! –

+0

这完美的作品!谢谢米哈伊尔。另外 - 有没有办法让这个查询扫描两列的关键字?例如A列:文本,B列:Text_2 –

0

您可以使用派生表包括所有你正在寻找的话,然后用聚集计数比赛:

SELECT w.keyword, COUNT(s.Text) 
From (SELECT 'facebook' as keyword UNION ALL 
     SELECT 'cnn' 
    ) w LEFT JOIN 
    Data.Set_1 s 
    ON s.Text CONTAINS w.keyword 
GROUP BY w.keyword; 

请注意:这不是特别有效。性能应该与关键字数量大致呈线性关系。

+0

嗨戈登 - 你不睡觉..?我总是看到你在这里Stackoverflow :) – Teja

+0

谢谢戈登,这看起来很有用 - 我很新的SQL,所以忍受我..我可以问为什么“W”。关键字之前和“s”。文字前? –

+0

@EdMoonLittle。 。 。因为我建议在具有多个表的所有查询中使用表别名(在只有一个表的查询中是可选的)。 –

相关问题