2012-04-06 16 views
6

Estoy intentando aprender colmena. Sorprendentemente, no puedo encontrar un ejemplo de cómo escribir un simple trabajo de conteo de palabras. Es el siguiente correcto?Programa de recuento de palabras en Hive

Digamos que tengo un archivo de entrada input.tsv:

hello, world 
this is an example input file 

creo un divisor en Python para convertir cada línea en palabras:

import sys 

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

Y entonces he lo siguiente en mi guión Colmena :

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; 

no estoy seguro de si me falta algo, o si realmente es thi es complicado (En particular, ¿necesito la tabla temporal words, y qué tengo que escribir la función de un separador externo?)

Respuesta

12

Si quieres un sencillo ver lo siguiente:

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

que utilizar una vista lateral para permitir el uso de una función de valor de tabla (explosión) que toma la lista que sale de la función de división y genera una nueva fila para cada valor. En la práctica, uso una UDF que envuelve el separador de palabras ICU4J de IBM. Generalmente no uso scripts de transformación y uso UDF para todo. No necesita una tabla de palabras temporales.

+0

mirando a su comentario que implica explotar y lateral en HiveQL, ¿Puede usted por favor, eche un vistazo a esta cuestión de forma, no soy capaz de encontrar la solución para eso, [http: // stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive](http://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive). Perdón por contactarte así. – ferhan

+0

@Steve - He cargado los datos en una tabla y cuando ejecuto el comando obtengo 'FAILED: Error en el análisis semántico: null'. ¿Hay algún prerrequisito para ejecutar el comando? –

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

Usted puede frases incorporada UDF en la colmena de la siguiente manera:

1) Paso 1: Crear una tabla temporal con una sola columna llamada oración del tipo array de datos

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

2) Paso 2: Seleccione sus palabras de la tabla temporal explotando nuevamente la oración de la columna

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

Cuestiones relacionadas