объединение сгруппированных результатов в Hive - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужно разбить запрос Hive, сгруппированный по столбцу идентификаторов, за кварталы календарного 2018 года. Ниже описывается, как я сейчас это делаю, я хотел бы получить еще один вариант для достижения того же результата с меньшим количеством запросов.

- запрос 1 квартал 1 2018 года плюс три идентичных запроса для Q2, Q3, Q4

Create TABLE Q12018 stored as ORC as
select
ID,
count(1) as cnt, 
sum(revenue) as revenue,
sum( (CASE
    WHEN condition1
    THEN 1
    ELSE 0 END)) as metric1,
sum( (CASE
    WHEN condition2
    THEN revenue
    ELSE 0 END)) as metric2,           

sum( (CASE
    WHEN condition3
    THEN 1
    ELSE 0 END)) as metric3,
sum( (CASE
    WHEN codition4
    THEN revenue
    ELSE 0 END)) as metric4                            
from mainTable
where month between 201801 and 201803
group by 
ID;

- запрос 2

Create TABLE combined2018 stored as ORC as

select * from  Q12018 

union all

select * from  Q22018 

union all

select * from  Q32018 

union all 

select * from  Q42018 ;

- запрос 3

Create TABLE Agg2018 stored as ORC as

Select 
ID,
Sum(cnt),
Sum(revenue),
Sum(metric1),
Sum(metric2),
sum(metric3),
sum(metric4)
from combined2018  
group by ID

1 Ответ

0 голосов
/ 20 сентября 2019

Похоже, что в конце вы агрегируете все квартальные результаты, сгруппированные по ID. Если конечным результатом является агрегация квартальных результатов, то измените предложение where, включив весь диапазон года для достижения того же конечного результата.

select
   ID,
   count(1) as cnt, 
   sum(revenue) as revenue,
   sum((CASE  WHEN condition1  THEN 1  ELSE 0 END)) as metric1,
   sum((CASE  WHEN condition2  THEN revenue  ELSE 0 END)) as metric2,           
   sum((CASE  WHEN condition3  THEN 1  ELSE 0 END)) as metric3,
   sum((CASE  WHEN condition4  THEN revenue  ELSE 0 END)) as metric4                       
from mainTable
where month between 201801 and 201812
group by ID;
...