2012-04-06 4 views
6

Ich versuche, Hive zu lernen. Überraschenderweise kann ich kein Beispiel dafür finden, wie man einen einfachen Wortzähljob ​​schreibt. Ist das Folgende korrekt?Word Count-Programm in Hive

Lassen Sie uns sagen, ich habe eine Eingabedatei input.tsv:

hello, world 
this is an example input file 

ich einen Splitter in Python erstellen jede Zeile in Worte zu drehen:

import sys 

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

Und dann habe ich folgendes in meinem Hive Skript :

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; 

Ich bin nicht sicher, ob ich etwas vermisse, oder wenn es wirklich thi ist s kompliziert. (Insbesondere muss ich die temporäre words Tisch, und muss ich die externe Splitter-Funktion schreiben?)

Antwort

12

Wenn Sie eine einfache sehen wollen, dass die folgenden Schritte aus:

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

Ich benutze eine Seitenansicht um die Verwendung einer Tabellenwertfunktion (Explode) zu ermöglichen, die die Liste, die aus der Split-Funktion kommt, aufnimmt und für jeden Wert eine neue Zeile ausgibt. In der Praxis verwende ich eine UDF, die den ICU4J-Worttrennschalter von IBM umschließt. Im Allgemeinen verwende ich keine Transformations-Skripte und verwende UDFs für alles. Sie benötigen keine Tabelle mit temporären Wörtern.

+0

an Ihrem Kommentar sucht Einbeziehung explodieren und Seitenansicht in HiveQL, Können Sie bitte einen Blick in diese Frage SO nehmen, ich bin nicht in der Lage, die Lösung für das finden, [http: // stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive](http://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive). Entschuldigung, dass ich dich so kontaktiere. – ferhan

+0

@Steve - Ich habe die Daten in eine Tabelle geladen und wenn ich den Befehl ausführen bekomme ich 'FAILED: Fehler in der semantischen Analyse: null'. Gibt es Voraussetzungen zum Ausführen des Befehls? –

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

Sie können Sätze eingebauten UDF in hive wie folgt:

1) Schritt 1: Erstellen Sie eine temporäre Tabelle mit einer einzigen Spalte namens Satz von Datentyp Array

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

2) Schritt 2: Wählen Sie Ihre Wörter aus der Temp-Tabelle wieder explodiert den Spaltensatz

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