2016-10-07 15 views
1

Google BigQueryでクエリを実行しようとしているデータが15万行あります。特定の単語を含む行を検索し、各単語の数を返す方法は?

Textには、さまざまな長さのテキストが含まれており、特定のキーワードをクエリしたいと思います。

私は限りクエリとして得て、それ以下の特定のキーワード(例えばFacebookの)を含むすべての行を返してきた

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

質問:

1)私は、クエリを改善するにはどうすればよいのそのため、新しいコラムの 'Text'にキーワード 'facebook'のすべての出現回数が返されます。

2)これを複数のキーワード(facebook、cnn、bbc、twitter)に高め、データに存在する各キーワードの総数を返します(facebook 42、cnn 54、bbc 88、twitter 49など)。

答えて

0

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

"テキストLIKE CONCAT( '%'、キーワード、 '%')は危険です。キーワードにはエスケープする必要のある特殊文字が含まれる可能性があるためです。それはあまり効果がありません。ここで使うより良い機能は "STRPOS(テキスト、キーワード)> 0" –

+0

が更新されました! –

+0

これは完全に機能します!ありがとうミハイル。さらに、このクエリでキーワードの2つの列をスキャンする方法はありますか?たとえば、列A:テキスト、列B:テキスト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; 

注意してください:これは特に効率的ではありません。パフォーマンスは、キーワードの数がほぼ線形である必要があります。 BigQueryの標準SQLの場合

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 

と遊ぶのが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 

例について

+0

こんにちはゴードン - あなたは眠れない?私はいつもここにStackoverflowでお会いします:) – Teja

+0

おかげでゴードン、これは役に立つと思われます - 私は非常にSQLので、私のクマです..私はなぜ "w"を尋ねることができますか?キーワードの前に、 "s"テキストの前に? –

+0

@EdMoonLittle。 。 。複数のテーブルを持つすべてのクエリでテーブルエイリアスを使用することをお勧めします(1つのテーブルのみのクエリではオプション)。 –

関連する問題