2012-01-27 14 views
12

Quiero crear una tabla Hive donde los archivos de texto de entrada se atraviesan en múltiples subdirectorios en hdfs. Así ejemplo tengo en hdfs:Colmena: creación de tablas con varios archivos con múltiples directorios

/testdata/user/Jan/part-0001 
    /testdata/user/Feb/part-0001 
    /testdata/user/Mar/part-0001 
and so on... 

Si quiero crear un usuario en la tabla colmena, pero tienen que ser capaces de atravesar los subdirectorios de usuario, se puede hacer esto? Intenté algo como esto, pero no funciona;

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/*' 

Pensé que agregar el comodín funcionaría pero no lo hace. Cuando traté de no usar el comodín todavía no funciona. Sin embargo, si copio los archivos en el directorio raíz del usuario, entonces funciona. ¿No hay forma de que Hive atraviese los directorios secundarios y tome esos archivos?

Respuesta

5

colmena utiliza subdirectorios como particiones de los datos, por lo que simplemente:

CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) 
STORED AS TEXTFILE LOCATION '/testdata/user/' 

Eso debería hacerlo por usted.

+0

Esto no funcionó. En realidad, debería haber mencionado que estoy ejecutando CDH3u1 en este momento. – user706794

+2

Defina "No funcionó". También debería mencionar que necesitaría cambiar sus nombres de directorio a month = Jan etc ... –

0
CREATE EXTERNAL TABLE user (id int, name string); 
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users; 
+0

Esto no funcionó. En realidad, debería mencionar en CDH3u1 en este momento. – user706794

+0

no funcionó para mí en CDH5.7 – voldy

17

Puede crear una tabla externa y luego agregar subcarpetas como particiones.

CREATE EXTERNAL TABLE test (id BIGINT) PARTITIONED BY (yymmdd STRING); 
ALTER TABLE test ADD PARTITION (yymmdd = '20120921') LOCATION 'loc1'; 
ALTER TABLE test ADD PARTITION (yymmdd = '20120922') LOCATION 'loc2'; 
+0

¡Esta es una respuesta increíble! Sí, tienes la molestia de tener que actualizar la tabla cada vez que hay un nuevo directorio de datos (una vez al día en mi caso). Pero solo funciona sin problemas. –

+0

Esta es también una de las cosas geniales sobre cómo Hive almacena datos. Con los datos almacenados de esta manera, y representados como particiones, los datos de la partición se convierten en una columna virtual. Esto significa que cuando consultas de una manera que limita los resultados a un subconjunto de fechas (en este caso), Hive solo tiene que buscar en algunos lugares en lugar de escanear todo el conjunto de datos para tu respuesta. – agentv

+0

Esto debe seleccionarse como la respuesta aceptada; responde perfectamente la pregunta. También me ayudaste, así que ¡gracias por responder! –

5

Terminé usando un script de shell como el de abajo para un caso de uso donde los subdirectorios no se conocen a priori.

#!/bin/bash 
hive -e "CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) STORED AS TEXTFILE LOCATION '/testdata/user/'; " 

hscript="" 

for part in `hadoop fs -ls /testdata/user/ | grep -v -P "^Found"|grep -o -P "[a-zA-Z]{3}$"`; 
do 

echo $part 
tmp="ALTER TABLE users ADD PARTITION(month='$part');" 
hscript=$hscript$tmp 
done; 

hive -e "$hscript" 
Cuestiones relacionadas