2016-10-07 3 views
1

У меня есть 150 000 строк данных, которые я пытаюсь запросить в Google BigQuery.Как искать строки, содержащие конкретные слова, а затем возвращать количество каждого слова?

Столбец Text содержит различные длины текста, из которых я хочу запросить конкретные ключевые слова.

Я получил по мере запроса ниже, который возвращает все строки, содержащие определенное ключевое слово (например, facebook):

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

Вопросы:

1) Как улучшить запрос так что он возвращает общее количество всех вхождений ключевого слова «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 

Для BigQuery Стандартный 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 

Пример играть с

WITH keywords AS (
    SELECT 'facebook' AS keyword UNION ALL 
    SELECT 'cnn' AS keyword UNION ALL 
    SELECT 'bbc' AS keyword 
), 
words AS (
    SELECT 'facebookfacebookcnnbbccnn' AS Text UNION ALL 
    SELECT 'facebook' AS Text UNION ALL 
    SELECT 'cnn' AS Text 
) 
SELECT 
    keyword, 
    COUNT(1) AS `rows`, 
    SUM((LENGTH(Text) - LENGTH(REPLACE(Text, keyword, '')))/LENGTH(keyword)) AS occurences 
FROM words 
JOIN keywords 
ON STRPOS(Text, keyword) > 0 
GROUP BY keyword 
+1

«Текст LIKE CONCAT («% », ключевое слово,«% »)« опасен, потому что ключевое слово может содержать специальные символы, которые необходимо экранировать. Это также не очень хорошо. Лучшей функцией для использования здесь будет «STRPOS (текст, ключевое слово)> 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». перед ключевым словом и «с». перед текстом? –

+0

@EdMoonLittle. , , Потому что я рекомендую использовать псевдонимы таблиц во всех запросах, содержащих более одной таблицы (необязательно в запросах только с одной таблицей). –

Смежные вопросы