2011-08-26 23 views
8

Tengo un archivo de registro que contiene la columna timestamp. La marca de tiempo está en formato de tiempo de época de Unix.cómo convertir unix epoch tiempo hasta la fecha string en colmena

Quiero crear una partición basada en una marca de tiempo con particiones año, mes y día.

Hasta ahora he hecho esto pero está arrojando un error.

PARSE ERROR cannot recognize input '(' in column type 

Aquí está mi código.

from (
     from raw_data 
      MAP ${PREFIX}raw_data.line 
      USING 's3://scripts/clean.py' 
      AS (timestamp STRING, name STRING) 
    ) map_out 
INSERT OVERWRITE TABLE date_base_data_temp PARTITION(year(timestamp), month(timestamp)), day(timestamp))) 
    select map_out.name; 

Respuesta

24

Oof, que se ve feo. Trate de usar esta función en la colmena:

SELECT from_unixtime(unix_timestamp) as new_timestamp from raw_data ... 

O si marca de tiempo está en ms en lugar de segundos:

SELECT from_unixtime(unix_timestamp DIV 1000) as new_timestamp from raw_data ... 

que convierte una marca de tiempo Unix en un AAAA-MM-DD HH: MM: SS, entonces usted puede utilizar las siguientes funciones para obtener el año, mes y día:

SELECT year(new_timestamp) as year, month(new_timestamp) as month, day(new_timestamp) as day ... 
+0

Gracias! Ahorré mucho de mi tiempo. ¡Esto es exactamente lo que estaba buscando! –

+2

Asegúrate de que 'timestamp_value' (aquí' unix_timestamp') está en segundos; de lo contrario, usa 'from_unixtime (timestamp_value DIV 1000)' – narush

+0

Estoy obteniendo solo el tiempo hasta el segundo pero también quiero ms. Cómo puedo hacer eso ? – Avinash

4

con versiones más recientes de la colmena y SparkSQL, tipo de datos de opciones de la fecha y el tipo de fundición están disponibles. Siguiendo debe trabajar en la colmena, así como SQL Spark

SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable 
2

Si usted necesita para convertir la fecha en el formato personalizado, utilice la siguiente:

select date_format(from_unixtime(epoch_datetime),'yyyMM') as formatted_date from myHiveTable; 


que devolverá la fecha como por ejemplo yearMonth 201708

0

La adición de esta consulta a la lista en la que la marca de tiempo necesita ser convertida a cadena de fecha aaaa-MM-dd para una partición cadena:

hive> select date_format(from_unixtime(epoch_datetime), 'yyyy-MM-dd') as day from table_name limit 20; 

-- If required, remove the millis precision for timestamps 
hive> select date_format(from_unixtime(cast(epoch_datetime/1000 as bigint)), 'yyyy-MM-dd') as day from table_name limit 20; 
Cuestiones relacionadas