2012-04-06 2 views
6

Я пытаюсь узнать улей. Удивительно, но я не могу найти пример того, как писать простую задачу подсчета слов. Правильно ли следующее?Программа подсчета слов в улье

Скажем, у меня есть входной файл input.tsv:

hello, world 
this is an example input file 

я создаю сплиттер в Python, чтобы превратить каждую строку в словах:

import sys 

for line in sys.stdin: 
for word in line.split(): 
    print word 

И тогда я следующий в моем улей сценарии :

CREATE TABLE input (line STRING); 
LOAD DATA LOCAL INPATH 'input.tsv' OVERWRITE INTO TABLE input; 

-- temporary table to hold words... 
CREATE TABLE words (word STRING); 

add file splitter.py; 

INSERT OVERWRITE TABLE words 
    SELECT TRANSFORM(text) 
    USING 'python splitter.py' 
    AS word 
    FROM input; 

SELECT word, count(*) AS count FROM words GROUP BY word; 

Я не уверен, что мне что-то не хватает, или если это действительно так сложно. (В частности, нужна ли мне временную words таблицы, и мне нужно, чтобы написать функцию внешнего сплиттера?)

ответ

12

Если вы хотите просто один увидеть следующее:

SELECT word, COUNT(*) FROM input LATERAL VIEW explode(split(text, ' ')) lTable as word GROUP BY word; 

Я использую вид сбоку чтобы включить использование функции с табличной оценкой (взорваться), которая берет список, который выходит из функции split, и выводит новую строку для каждого значения. На практике я использую UDF, который обертывает прерыватель Word ICU4J IBM. Обычно я не использую скрипты преобразования и не использую UDF для всего. Вам не нужна временная таблица слов.

+0

глядя на ваш комментарий с участием взрываются и вид сбоку в HiveQL, Вы можете, пожалуйста, посмотрите в этот СЦ вопрос, я не могу найти решение для этого, [HTTP: // stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive](http://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive). Извините за то, что обратились к вам так. – ferhan

+0

@Steve - я загрузил данные в таблицу, и когда я запускаю команду, я получаю 'FAILED: ошибка в семантическом анализе: null'. Существуют ли какие-либо предпосылки для запуска команды? –

2
CREATE TABLE docs (line STRING); 
LOAD DATA INPATH 'text' OVERWRITE INTO TABLE docs; 
CREATE TABLE word_counts AS 
SELECT word, count(1) AS count FROM 
(SELECT explode(split(line, '\s')) AS word FROM docs) w 
GROUP BY word 
ORDER BY word; 
1

Вы можете предложения встроенных UDF в улей следующим образом:

1) Шаг 1: Создайте временную таблицу с одной колонкой под названием предложение массива данных типа

create table temp as select sentence from docs lateral view explode(explode(sentences(lcase(line)))) ltable as sentence

2) Шаг 2: Выберите слова из таблицы темпов, снова взорвав предложение колонки

select words,count(words) CntWords from 
 
(
 
select explode(words) words from temp 
 
) i group by words order by CntWords desc

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