2016-10-07 75 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。 。 。因爲我建議在具有多個表的所有查詢中使用表別名(在只有一個表的查詢中是可選的)。 –

相關問題