create - hadoop hive partition example
Tabla Partition Hive por campo existente? (4)
No. Tendrás que abandonar ese campo o, al menos, cambiarle el nombre.
¿Puedo particionar una tabla Hive luego de insertarla en un campo existente?
Tengo un archivo de 10 GB con un campo de fecha y un campo de hora del día. ¿Puedo cargar este archivo en una tabla, luego insertar-sobrescribir en otra tabla particionada que usa esos campos como una partición? ¿Algo como el siguiente trabajo?
INSERT OVERWRITE TABLE tealeaf_event PARTITION(dt=evt.datestring,hour=evt.hour)
SELECT * FROM staging_event evt;
¡Gracias!
Travis
No estoy seguro de esto, pero algo así podría funcionar
INSERT OVERWRITE TABLE tealeaf_event
SELECT col1 as tealeaf_col1, ..., datestring as ds;
Quizás esto ya está respondido ... pero sí, puedes hacer exactamente lo que has dicho. Lo he hecho muchas veces. Obviamente, su nueva tabla debería definirse de manera similar a la original, pero sin la columna de partición y con la especificación de la partición. Además, no puedo recordar si tenía que enumerar explícitamente las columnas en la tabla original, o si el asterisco era suficiente.
Me topé con esto tratando de responder la misma pregunta y fue útil, pero no del todo completo. La respuesta corta es sí, algo así como la consulta en la pregunta funcionará pero la sintaxis no es del todo correcta.
Supongamos que tiene tres tablas que se crearon con las siguientes afirmaciones:
CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);
CREATE TABLE staging_partitioned (a int, b int)
PARTITIONED BY (datestring string, hour int);
CREATE TABLE production_partitioned (a int, b int)
PARTITIONED BY (dt string, hour int);
Las columnas a
y b
son solo algunas columnas de ejemplo. dt
y hour
son los valores en los que queremos particionar una vez que llega a la tabla de producción. Mover los datos de staging_unpartitioned
a la producción de staging_unpartitioned
y staging_partitioned
tiene el mismo aspecto.
INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_unpartitioned;
INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_partitioned;
Esto usa un proceso llamado Partición dinámica que puedes leer aquí . Lo importante a tener en cuenta es qué columnas están asociadas con qué particiones está determinada por el orden SELECCIONAR. Todas las particiones dinámicas se deben seleccionar al final y en orden.
Hay una buena posibilidad de que cuando intente ejecutar el código anterior, se produzca un error debido a las propiedades que ha establecido. En primer lugar, no funcionará si tiene una partición dinámica deshabilitada, así que asegúrese de:
set hive.exec.dynamic.partition=true;
A continuación, puede obtener un error si no está particionando en al menos una partición estática antes de las particiones dinámicas. Esta restricción le evitaría eliminar accidentalmente una partición raíz cuando tuviera la intención de sobrescribir sus subparticiones con particiones dinámicas. En mi experiencia, este comportamiento nunca ha sido útil y, a menudo ha sido molesto, pero su kilometraje puede variar. En cualquier caso, es fácil de cambiar:
set hive.exec.dynamic.partition.mode=nonstrict;
Y eso debería hacerlo.