date - example - how is data stored in hive partitioned tables
Hive: partición dinámica agregando a la tabla externa (4)
Estoy ejecutando la sección 071, procesando los datos existentes que tienen el siguiente diseño de directorio:
-Nombre de la tabla
- d = (por ejemplo, 2011-08-01)
- d = 2011-08-02
- d = 2011-08-03
... etc
Debajo de cada fecha tengo los archivos de fecha.
ahora para cargar los datos que estoy usando
CREATE EXTERNAL TABLE table_name (i int)
PARTITIONED BY (date String)
LOCATION ''${hiveconf:basepath}/TableName'';**
Me gustaría que mi script de Hive pueda cargar las particiones relevantes de acuerdo con la fecha de entrada y el número de días. así que si paso la fecha = ''2011-08-03'' y los días = ''7''
El script debe cargar las siguientes particiones - d = 2011-08-03
- d = 2011-08-04
- d = 2011-08-05
- d = 2011-08-06
- d = 2011-08-07
- d = 2011-08-08
- d = 2011-08-09
No he encontrado ninguna manera discrepante de hacerlo, excepto la ejecución explícita:
ALTER TABLE table_name ADD PARTITION (d=''2011-08-03'');
ALTER TABLE table_name ADD PARTITION (d=''2011-08-04'');
ALTER TABLE table_name ADD PARTITION (d=''2011-08-05'');
ALTER TABLE table_name ADD PARTITION (d=''2011-08-06'');
ALTER TABLE table_name ADD PARTITION (d=''2011-08-07'');
ALTER TABLE table_name ADD PARTITION (d=''2011-08-08'');
ALTER TABLE table_name ADD PARTITION (d=''2011-08-09'');
y luego ejecutando mi consulta
select count(1) from table_name;
sin embargo, esto no es automático, de acuerdo con la fecha y los días ingresados
¿Hay alguna forma en que pueda definir la tabla externa para cargar particiones de acuerdo con el rango de fechas o la aritmética de fechas?
He explicado el escenario similar en mi blog:
1) Necesitas establecer propiedades:
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
2) Cree una tabla de etapas externa para cargar los datos de los archivos de entrada en esta tabla.
3) Cree una tabla externa de producción principal "orden de producción" con el campo de fecha como una de las columnas particionadas.
4) Cargue la tabla de producción de la tabla de etapas para que los datos se distribuyan en particiones automáticamente.
Explicó el concepto similar en la siguiente publicación del blog. Si quieres ver el código.
http://exploredatascience.blogspot.in/2014/06/dynamic-partitioning-with-hive.html
Las particiones son una segmentación física de los datos, donde la partición es mantenida por el sistema de directorios y las consultas utilizan los metadatos para determinar dónde se encuentra la partición. así que si puede hacer que la estructura del directorio coincida con la consulta, debería encontrar los datos que desea. por ejemplo:
select count(*) from table_name where (d >= ''2011-08-03) and (d <= ''2011-08-09'');
pero no sé de ninguna operación de rango de fechas, de lo contrario, primero tendrá que hacer los cálculos para crear el patrón de consulta.
también puede crear tablas externas y agregarles particiones que definan la ubicación. Esto le permite destruir los datos como desee y seguir utilizando el esquema de partición para optimizar las consultas.
No creo que haya ninguna funcionalidad incorporada para esto en Hive. Es posible que pueda escribir un complemento. Creando UDFs personalizados
Probablemente no necesite mencionar esto, pero ¿ha considerado un simple script de bash que tomaría sus parámetros y canalizaría los comandos a la colmena?
Los flujos de trabajo de Oozie serían otra opción, sin embargo, eso podría ser una exageración. Oozie Hive Extension - Después de pensar un poco, no creo que Oozie funcione para esto.
Tengo un problema muy similar donde, después de una migración, tengo que volver a crear una tabla para la que tengo los datos, pero no los metadatos. La solución parece ser, después de recrear la tabla:
MSCK REPAIR TABLE table_name;
Esto también menciona la "alter table X recover partitions"
que OP comentó en su propia publicación. MSCK REPAIR TABLE table_name;
funciona en implementaciones que no sean de Amazon-EMR (Cloudera en mi caso).