Hoy me he encontrado un problema al intentar crear una query con la que poder crear una tabla particionada con una sentencia CREATE AS SELECT.
Mi problema viene dado porque en el caso de Impala no permitía la ejecución de la sentencia LATERAL VIEW que necesitaba para poder recuperar los datos tal y como los necesitaba y por la necesidad de crear la tabla con una partition dinámica.
set hive.exec.dynamic.partition.mode=nonstrict;
En la que la partición es la fecha (data_date string)
CREATE TABLE IF NOT EXISTS db_name.table_name (rowid bigint, campo1 string, campo2 string, campo3 bigint, msg string) PARTITIONED BY (data_date string);
Las dos primeras sentencias se ejecutan en Impala, y posteriormente se ejecuta la inserción de los datos a partir de una tabla origen desde HIVE.
INSERT INTO db_name.table_name PARTITION (data_date=’${LOAD_DATE}’) SELECT rowid, campo1, campo2, campo3, salida.flag as msg from db_name.table_name_tmp LATERAL VIEW explode(array(error1,error2,error3,error4,error5)) salida as flag where salida.flag!=»;
En esta sentencia hay que destacar algunos detalles interesantes:
1. el alias salida sirve para identificar una «tabla temporal» con la información recuperada por la sentencia LATERAL VIEW EXPLODE(ARRAY(xxx,xxx,…..).
2. tras recuperar la info contenida en tabla_origen como error1, error2, etc, hacemos referencia a ella en el WHERE con salida.flag y recuperamos la info que no es vacía, aunque la condición podría ser otra.
3. en la sentencia del SELECT hacemos referencia a salida.flag as msg para hacer referencia al valor recuperado del LATERAL VIEW y guardarlo en la tabla destino en el campo msg que es el alias que le ponemos al hacer la SELECT.