2016-10-29 2 views
2

Ich habe eine Anforderung wo-in ich muss Datenzusammenfassung in dem Datumsbereich als Eingabe bereitgestellt werden. Um genauer zu sein: Wenn meine Daten wie folgt aussehen:Datenzusammenfassung in Apache Pig/Apache Hive für einen bestimmten Datumsbereich

Input: 
Id|amount|date 
1 |10 |2016-01-01 
2 |20 |2016-01-02 
3 |20 |2016-01-03 
4 |20 |2016-09-25 
5 |20 |2016-09-26 
6 |20 |2016-09-28 

Und wenn ich die Zusammenfassung für den Monat September will, dann ich brauche Anzahl der Datensätze auf vier Bereiche zu berechnen, die sind:

  1. Aktuelles Datum, das jeden Tag im September ist.
  2. Startdatum der Woche (Sonntag der Woche gemäß dem aktuellen Datum) bis Aktuelles Datum, Bsp. Wenn Current Date ist 2016-09-28, dann wäre das Startdatum der Woche 2016-09-25 und die Anzahl der Datensätze zwischen 2016-09-25 bis 2016-09-28.
  3. Monat Startdatum zum aktuellen Datum, das vom 01.09.2016 bis zum aktuellen Datum liegt.
  4. Jahr Startdatum bis zum aktuellen Datum, das ist die Anzahl der Datensätze vom 01.01.2016 bis zum aktuellen Datum.

So Meine Ausgabe einen Datensatz mit 4 Spalten für jeden Tag des Monats haben soll (in diesem Fall ist Monat September), so etwas wie

Output: 

Current_Date|Current_date_count|Week_To_Date_Count|Month_to_date_Count|Year_to_date_count 

2016-09-25 |1     |1     |1     |4 
2016-09-26 |1     |2     |3     |5 
2016-09-28 |1     |3     |3     |6 

Wichtig: i2 nur passieren kann Variablen, das ist das Anfangsdatum und das Enddatum des Bereichs. Ruheberechnung muss dynamisch sein.

Vielen Dank im Voraus

Antwort

1

Sie auf Jahr beitreten, dann jede Bedingung separat testen (mit sum(if())):

select a.date, sum(if(a.date=b.date,1,0)), 
       sum(if(month(a.date)=month(b.date) and weekofyear(a.date)=weekofyear(b.date),1,0)), 
       sum(if(month(a.date)=month(b.date),1,0)), 
       count(*) from 
(select * from input_table where date >= ${hiveconf:start} and date <${hiveconf:end}) a, 
(select * from input_table where date <${hiveconf:end}) b 
where year(a.date)=year(b.date) and b.date <= a.date group by a.date; 
+0

Dank Alex !!. Aber ein paar Punkte hier ist: –

+0

Danke Alex !!. Aber wenige Punkte hier ist: 1. Die weekofyear Funktion betrachtet Montag als Woche Startdatum. In meinem Fall muss Sonntag das Startdatum der Woche sein und 2. das kartesische Produkt läuft für immer mit minimalen Daten in meinen Basistabellen, selbst nach der Verwendung von Tez. –

+0

@ AKN_1513 müssen Sie dann Ihre eigene benutzerdefinierte Weekofyear UDF implementieren. In Bezug auf die Geschwindigkeit, versuchen Sie die Abfrage, die auf dem Jahr verbindet .. versuchen Sie nur count (*) auf der Oberseite auswählen, versuchen Sie zu finden, was die Verzögerung verursacht. –

Verwandte Themen