usando tipos tablas tabla que externa datos crear creacion arquitectura hadoop amazon-s3 amazon-web-services hive elastic-map-reduce

hadoop - que - tipos de tablas en hive



Cargar datos con Hive, S3, EMR y recuperar particiones (1)

SOLUCIONADO: Vea la Actualización # 2 a continuación para la ''solución'' a este problema.

~~~~~~~

En s3, tengo algunos archivos de registro * .gz almacenados en una estructura de directorios anidados como:

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

Estoy intentando cargarlos en Hive on Elastic Map Reduce (EMR), usando una especificación de partición multinivel como:

create external table logs (content string) partitioned by (y string, m string, d string, h string) location ''s3://($BUCKET)'';

La creación de la tabla funciona. Luego intento recuperar todas las particiones existentes:

alter table logs recover partitions;

Esto parece funcionar y se profundiza a través de mi estructura s3 y agrega todos los diferentes niveles de directorios:

hive> show partitions logs; OK y=2012/m=11/d=06/h=08 y=2012/m=11/d=06/h=09 y=2012/m=11/d=06/h=10 y=2012/m=11/d=06/h=11 y=2012/m=11/d=06/h=12 y=2012/m=11/d=06/h=13 y=2012/m=11/d=06/h=14 y=2012/m=11/d=06/h=15 y=2012/m=11/d=06/h=16 ...

Parece que Hive puede ver e interpretar mi diseño de archivo con éxito. Sin embargo, nunca se cargan datos reales. Si intento hacer un conteo simple o seleccionar *, no obtengo nada:

hive> select count(*) from logs; ... OK 0 hive> select * from logs limit 10; OK hive> select * from logs where y = ''2012'' and m = ''11'' and d = ''06'' and h=''16'' limit 10; OK

¿Pensamientos? ¿Me falta algún comando adicional para cargar datos más allá de recuperar las particiones?

Si agrego manualmente una partición con una ubicación explícita, entonces eso funciona:

alter table logs2 add partition (y=''2012'', m=''11'', d=''09'', h=''10'') location ''s3://($BUCKET)/y=2012/m=11/d=09/H=10/''

Puedo escribir un guión para hacer esto, pero parece que me falta algo fundamental para recuperar particiones.

ACTUALIZACIÓN # 1

Gracias a una observación brillante y entusiasta de Joe K en un comentario a continuación, creo que los problemas de sensibilidad de caso podrían estar involucrados aquí.

Los archivos están definitivamente organizados como la siguiente especificación de ruta, con una H en mayúscula (creo que esto podría ser un guiño al formato iso8601):

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

Creo mi tabla externa con una especificación de partición que tiene las mayúsculas adecuadas:

partitioned by (y string, m string, d string, H string)

(Observe la ''H''). Hago una recuperación de particiones, que parece recurrir a través de los directorios y encontrar las particiones de forma adecuada, pero de alguna manera (a pesar de usar ''H'' en todos los lugares instructivos hasta ahora), parece que Hive lo guarda como minúscula ''h'' :

hive> show partitions logs; OK y=2012/m=11/d=06/h=08

(Tenga en cuenta la ''h''). Parece que Hive puede descubrir las particiones, pero luego las almacena en forma de minúscula ... Más tarde, cuando va a buscar datos, estas rutas están (por supuesto) vacías porque S3 distingue entre mayúsculas y minúsculas.

Voy a mover mis datos a una estructura de directorios en minúsculas y ver si eso funciona ...

ACTUALIZACIÓN # 2

De hecho, he confirmado que la ''H'' en mayúscula como nombre de la partición (en el formato de archivo s3) fue el problema aquí. Por lo que puedo decir, esto es lo que estaba sucediendo:

  • Mi diseño en S3 tenía un nombre de partición sensible a mayúsculas y minúsculas (H =)
  • Al ejecutar RECOVER PARTITIONS, se descubren correctamente estas particiones ...
  • Pero luego se almacenan internamente como minúsculas (h)

El comando ''recuperar particiones'' es una extensión de Hive creada por Amazon. Sospecho fuertemente que el error está en este componente. Que yo sepa, Hive nativo no tiene el concepto de explorar una raíz de archivo para el descubrimiento de particiones ...


¡Es un problema de caso en el campo de la hora!