2012-04-06 13 views
6

Próbuję uczyć się Hive. Co zaskakujące, nie mogę znaleźć przykładu, jak napisać proste zadanie liczenia słów. Czy poniższe wskazówki są prawidłowe?Program liczenia słów w Ulu

Powiedzmy mam pliku wejściowego input.tsv:

hello, world 
this is an example input file 

tworzę splitter w Pythonie, aby włączyć każdy wiersz słowami:

import sys 

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

a następnie Mam następujących w moim Hive skryptu :

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; 

Nie jestem pewien, czy czegoś brakuje, czy tak naprawdę jest s skomplikowane. (W szczególności, muszę tymczasowy words tabelę, a muszę napisać funkcję rozgałęźnika zewnętrznego?)

Odpowiedz

12

Jeśli chcesz prosta zobacz:

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

używam widok boczny aby umożliwić korzystanie z funkcji wycenianej za pomocą tabeli (eksplodować), która pobiera listę, która wychodzi z funkcji podziału i wyprowadza nowy wiersz dla każdej wartości. W praktyce używam UDF, który otacza łamacz ICU4J IBM. Generalnie nie używam skryptów transformacji i używam UDF do wszystkiego. Nie potrzebujesz tabeli tymczasowych słów.

+0

patrząc na swoim komentarzu udziałem eksplodować i widok boczny w HiveQL, można proszę spojrzeć na ten SO pytanie, nie jestem w stanie znaleźć rozwiązania, które [http: // stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive](http://stackoverflow.com/questions/11373543/explode-tray-array-of-struct-in-hive). Przepraszamy za skontaktowanie się z Tobą w ten sposób. – ferhan

+0

@Steve - Załadowałem dane do tabeli i po uruchomieniu polecenia otrzymuję komunikat "FAILED: Błąd w analizie semantycznej: null". Czy są jakieś warunki wstępne do uruchomienia polecenia? –

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

Użytkownik może zdania wbudowany UDF w ulu następująco:

1) Krok 1: Utwórz tabelę temp z jednej kolumnie o nazwie zdanie typu danych tablicy

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

2) Krok 2: Wybierz słowa z tabeli temp ponownie eksplodując kolumnę zdanie

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