2012-08-06 35 views
5

¿Hay alguna forma de obtener el current date -1 en Hive significa yesterdays date siempre? Y en este formato- 20120805?Obtenga la sysdate -1 en Hive

puedo dirigir mi consulta como esta para obtener los datos de yesterday's date como en la actualidad es Aug 6th -

select * from table1 where dt = '20120805'; 

Pero cuando traté de hacerlo de esta manera con date_sub function para obtener la fecha de ayer como la tabla a continuación se somete a reparto de columna de fecha (dt).

select * from table1 where dt = date_sub(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(), 
'yyyyMMdd')) , 1)  limit 10; 

¿Está buscando los datos en todas las particiones? ¿Por qué? Algo mal que estoy haciendo en mi consulta?

¿Cómo puedo hacer que la evaluación suceda en una subconsulta para evitar el escaneo de toda la tabla?

Respuesta

10

Pruebe algo como:

select * from table1 
where dt >= from_unixtime(unix_timestamp()-1*60*60*24, 'yyyyMMdd'); 

Esto funciona si no te importa que la colmena escanee toda la tabla. from_unixtime no es determinista, por lo que el planificador de consultas en Hive no se optimizará para usted. Para muchos casos (por ejemplo, archivos de registro), no especificar una clave de partición determinista puede provocar que se inicie un trabajo hadoop muy grande, ya que escaneará toda la tabla, no solo las filas con la clave de partición especificada.

Si esto te importa, puede iniciar colmena con una opción adicional

$ hive -hiveconf date_yesterday=20150331 

Y en el guión o el uso de terminales colmena

select * from table1 
where dt >= ${hiveconf:date_yesterday}; 

El nombre de la variable no importa, ni tampoco el valor, puede configurarlos en este caso para obtener la fecha anterior usando comandos de Unix. En el caso específico de la OP

$ hive -hiveconf date_yesterday=$(date --date yesterday "+%Y%m%d") 
1

en MySQL:

select DATE_FORMAT(curdate()-1,'%Y%m%d'); 

En sqlserver:

SELECT convert(varchar,getDate()-1,112) 

Utilice esta consulta:

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()-1*24*60*60,'%Y%m%d'); 
+0

¿Qué pasa con Hive, como pregunta claramente mencionada para hacer lo mismo en la colmena? – ferhan

+0

me eddited mi respuesta.prueba esa consulta –

+2

Esto no está funcionando. Lo intenté y no recibo nada, – ferhan

1

Parece que DATE_SUB asume fecha en formato yyyy-MM-dd. Por lo tanto, es posible que deba hacer un poco más de manipulación de formato para llegar a su formato. Prueba esto:

select * from table1 
where dt = FROM_UNIXTIME(
       UNIX_TIMESTAMP(
        DATE_SUB(
         FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd') 
        , 1) 
       ) 
      , 'yyyyMMdd')  limit 10; 
+0

'FROM_UNIXTIME (UNIX_TIMESTAMP(), 'aaaa-MM-dd')' se puede reemplazar por 'current_date' –

0

Utilice esta:

select * from table1 where dt = date_format(concat(year(date_sub(current_timestamp,1)),'-', month(date_sub(current_timestamp,1)), '-', day(date_sub(current_timestamp,1))), 'yyyyMMdd') limit 10; 

Esto le dará un resultado determinista (una cadena) de la partición.

Sé que es super detallado.