2016-07-15 130 views
5

Ho due timestamp come input. Voglio calcolare la differenza di orario in ore tra quelle date e ora esclusa la domenica.Calcolare il numero di giorni esclusa la domenica in Hive

posso ottenere il numero di giorni utilizzando datediff funzione nel alveare.

È possibile ottenere il giorno di una data specifica utilizzando da_unixtime (unix_timestamp (startdate), 'EEEE').

Ma non so come collegare tali funzioni per raggiungere il mio requisito o esiste un altro modo semplice per raggiungere questo obiettivo.

Grazie in anticipo.

+0

cosa intendete escludere la domenica. –

risposta

6

È possibile scrivere una UDF personalizzata che prende due colonne contenenti le date come input e conta la differenza tra le date esclusa la domenica.

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Date; 
import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 

public class IsoYearWeek extends UDF { 

    public LongWritable evaluate(Text dateString,Text dateString1) throws ParseException { //takes the two columns as inputs 
    SimpleDateFormat date = new SimpleDateFormat("dd/MM/yyyy"); 
/* String date1 = "20/07/2016"; 
    String date2 = "28/07/2016"; 
*/ int count=0; 

    List<Date> dates = new ArrayList<Date>(); 

    Date startDate = (Date)date.parse(dateString.toString()); 
    Date endDate = (Date)date.parse(dateString1.toString()); 
    long interval = 24*1000 * 60 * 60; // 1 hour in millis 
    long endTime =endDate.getTime() ; // create your endtime here, possibly using Calendar or Date 
    long curTime = startDate.getTime(); 
    while (curTime <= endTime) { 
     dates.add(new Date(curTime)); 
     curTime += interval; 
    } 
    for(int i=0;i<dates.size();i++){ 
     Date lDate =(Date)dates.get(i); 
     if(lDate.getDay()==0){ 
      count+=1; //counts the number of sundays in between 
     } 
    } 

     long days_diff = (endDate.getTime()-startDate.getTime())/(24 * 60 * 60 * 1000)-count; //displays the days difference excluding sundays 
     return new LongWritable(days_diff); 

    } 

} 
+0

Io voto per questa soluzione. Forse il codice dovrebbe essere migliorato, ma non so come il tuo compito può essere realizzato senza UDF in modo efficiente. È anche possibile utilizzare lo script di shell o python per lo stesso. È anche possibile utilizzare la tabella 'date_dim' per unire i dati per escludere la domenica, quindi sommare (giorni), ma in questo caso preferirei UDF. – leftjoin