Программа подсчета слов в Hive
Я пытаюсь узнать улья. Удивительно, но я не могу найти пример того, как написать простое задание подсчета слов. Правильно ли следующее?
Допустим, у меня есть входной файл 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
таблица, и мне нужно написать внешнюю функцию splitter?)
3 ответов
Если вы хотите просто увидеть следующее:
SELECT word, COUNT(*) FROM input LATERAL VIEW explode(split(text, ' ')) lTable as word GROUP BY word;
Я использую боковой вид, чтобы включить использование функции с табличным значением (explode), которая берет список, который выходит из функции split и выводит новую строку для каждого значения. На практике я использую UDF, который обертывает IBM ICU4J Word breaker. Обычно я не использую сценарии преобразования и использую UDFs для всего. Вам не нужна временная таблица слов.
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;
вы можете предложения встроенный UDF в улье следующим образом:
1) Шаг 1: Создайте временную таблицу с одним столбцом с именем предложение типа данных array
create table temp as select sentence from docs lateral view explode(explode(sentences(lcase(line)))) ltable as sentence
2) Шаг 2: Выберите слова из таблицы temp снова взрывая столбец предложение
select words,count(words) CntWords from
(
select explode(words) words from temp
) i group by words order by CntWords desc