vista - select en hive
Dejar caer una gama de particiones en HIVE (2)
Tengo una tabla Hive (ver 0.11.0) dividida por fecha de columna, de tipo cadena. Quiero saber si existe una forma en Hive de poder colocar particiones para un rango de fechas (por ejemplo, de ''fecha1'' a ''fecha2''). He intentado las siguientes consultas (tipo SQL), pero no parecen ser sintácticamente correctas:
ALTER TABLE myTable DROP IF EXISTS PARTITION
(date>=''date1'' and date<=''date2'');
ALTER TABLE myTable DROP IF EXISTS PARTITION
(date>=''date1'' && date<=''date2'');
ALTER TABLE myTable DROP IF EXISTS PARTITION
(date between ''date1'' and ''date2'');
No creo que haya ninguna solución válida hasta la fecha. Implementé una solución para este problema utilizando algunos scripts de shell, como por ejemplo:
for y in {2011..2014}
do
for m in {01..12}
do
echo -n "ALTER TABLE reporting.frontend DROP IF EXISTS PARTITION (year=0000,month=00,day=00,hour=00)"
for d in {01..31}
do
for h in {01..23}
do
echo -n ", PARTITION (year=$y,month=$m,day=$d,hour=$h)"
done
done
echo ";"
done
done > drop_partitions_v1.hql
El archivo .hql resultante se puede ejecutar simplemente utilizando la opción colmena (o beeline) -f.
Obviamente, los bucles deberían ser capaces de generar el rango que desea soltar, que podría ser no trivial. En el peor de los casos, necesitará utilizar varios de estos scripts de shell para eliminar el rango deseado de fechas.
Además, tenga en cuenta que en mi caso las particiones tenían cuatro claves (año, mes, día, hora). Si sus fechas / particiones están codificadas como cadenas (no es una buena idea en mi opinión), tendrá que ''compilar'' su cadena de destino de las variables y, m, d y h en el guión de shell, y trazar la cadena dentro de el comando echo Por cierto, la partición ficticia (que contiene solo 0) está allí para escribir fácilmente por medio de 3-4 bucles todo el comando ''ALTER TABLE'', que tiene una sintaxis especial.
Puedes probar el siguiente que funcionó.
ALTER TABLE myTable DROP PARTITION (date < ''date1'') , PARTITION (date >''date2'');