2017-06-15 8 views
0

Ich versuche, einige Stichproben auf meine Daten durch Zählen der Zeilen in den Partitionen, Zählen der Menge von 'Verwendungen', die ich für jeden Tag sehe, und Zählen der Anzahl der Werte, die ich sehe Für jeden Tag.läuft mehrere Zählungen und verbindet die Ergebnisse

konnte ich eine frühere Version der folgenden Abfrage erhalten, bevor zu arbeiten, aber ich muss es ohne zu merken, etwas geändert haben:

src as 
(
    select partition_date_column, count(*) as src_row_count 
    from database.table 
    where partition_date_column > '2016-01-01' 
    group by partition_date_column 
) 

, 
pst as 
(
    select timestamp_pst as datevalue, count(*) as timestamp_row_count 
    from database.table 
    where partition_date_column > '2016-01-01' 
    and timestamp_pst between '2016-01-01' and '2017-07-01' 
    group by timestamp_pst 
), 

users as 
(
    select timestamp_pst as user_datevalue, count(*) as user_count 
    from database.table 
    where partition_date_column > '2016-01-01' 
    and timestamp_pst between '2016-01-01' and '2017-07-01' 
    and filter_column in ('filterA', 'filterB') 
    group by timestamp_pst 
) 

select datevalue as dayval, src_row_count, timestamp_row_count, user_count 
from pst 
left join src 
on datevalue = partition_date_column 
left join users 
on datevalue = user_datevalue 
order by dayval; 

ich nicht klar bin, was Formatierungsfehler machte ich Hive verursachen das nicht zu erkennen. Ich denke auch, dass es wahrscheinlich eine bessere Möglichkeit gibt, diese drei Elemente zu zählen, obwohl man sich in einer anderen Spalte befindet.

+0

Wird ein Fehler angezeigt? Was macht es nicht? Zeigen Sie einige Beispieldaten und gewünschte Ergebnisse an. –

Antwort

0

Ich fand es heraus. Mir fehlte das "WITH" am Anfang des Codes, der mehrere Select-Anweisungen wie diese erlaubte.

With src as 
(
    select partition_date_column, count(*) as src_row_count 
    from database.table 
    where partition_date_column > '2016-01-01' 
    group by partition_date_column 
) 

, 
pst as 
(
    select timestamp_pst as datevalue, count(*) as timestamp_row_count 
    from database.table 
    where partition_date_column > '2016-01-01' 
    and timestamp_pst between '2016-01-01' and '2017-07-01' 
    group by timestamp_pst 
), 

users as 
(
    select timestamp_pst as user_datevalue, count(*) as user_count 
    from database.table 
    where partition_date_column > '2016-01-01' 
    and timestamp_pst between '2016-01-01' and '2017-07-01' 
    and filter_column in ('filterA', 'filterB') 
    group by timestamp_pst 
) 

select datevalue as dayval, src_row_count, timestamp_row_count, user_count 
from pst 
left join src 
on datevalue = partition_date_column 
left join users 
on datevalue = user_datevalue 
order by dayval; 
0
select  pe.val as dt 

      ,count(case when pe.pos = 0 then 1 end) as src_row_count 

      ,count 
      (
       case 
        when pe.pos = 1 
         and pe.val between date '2016-01-01' and date '2017-07-01' 
        then 1 
       end 
      ) as timestamp_row_count 

      ,count 
      (
       case 
        when pe.pos = 1 
         and pe.val between date '2016-01-01' and date '2017-07-01' 
         and filter_column in ('filterA', 'filterB') 
        then 1 
       end 
      ) as user_count 

from  database.table t 
      lateral view posexplode (array(partition_date_column,timestamp_pst)) pe 

where  partition_date_column > date '2016-01-01' 

group by pe.val 
+0

Dies ist definitiv eine bessere Lösung, Leistung. –

Verwandte Themen