hive数值统计

84 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

在大数据开发中肯定会遇到统计类的需求,比如统计一年内每个月的订单数,并按照类目和城市区分,这时候就需要对订单数进行count处理,不仅要统计订单数还要统计订单总额,需要对订单额进行sum处理,并按照类目和城市分组统计。 下面举几个例子详细描述一下这类需求的写法。

首先这类的需求肯定会利用到临时表,在平时的数据需求开发中也要多用临时表来代替联表查询,这个可以提高查询性能,少用一些连表查询的方式。

首先将底表数据进行过滤,取出不同指标的统计时间,这里要用到union all的写法,所以取出的字段要保证一模一样才行,然后再用临时表将不同的指标数据拉成一张横表,此时不同的指标均有统计时间,指标参数,关联键等,即可为后续的统计做准备。

当然也可以在下面的具体正文逻辑中,将统计时间按照指定格式输出,将所有指标union all出来,然后将这张大横表拉成竖表,对数据进行分组汇总,按照类目和城市group by一下。

select
  id
,nvl(stat_day,-911)
,nvl(t0.a1_cnt               ,0)                         as a1_cnt                                             -- 指标1
,nvl(t0.a2_cnt                  ,0)                         as a2_cnt                                                -- 指标2
,nvl(t0.a3_amount_sum           ,0)                         as a3_sum                                         -- 指标3
,nvl(t0.a4_cnt        ,0)                                 as  a4_cnt                                     -- 指标4
,nvl(t0.a5_ct_cnt        ,0)                                 as  a5_cnt                                     -- 指标5
,nvl(t0.a6_cnt            ,0)                                 as  a6_cnt                                         -- 指标6
,nvl(t0.a7_cnt         ,0)                                 as  a7_cnt                                      -- 指标7
from
(
    select
        substr(fact_time,1,10)  as stat_day                                          -- 自然月,月维度报表
   ,count(distinct if(idx='a1',id,null))     as a1_cnt        
        ,count(distinct if(idx='a2',id,null))     as a2_cnt      
        ,count(distinct if(idx='a3',id,null))     as a3_cnt      
        ,count(distinct if(idx='a4',id,null))     as a4_cnt         
        ,sum(if(idx='a5',nvl(amount,0),0))                                                             as a6_cnt            
        ,count(distinct if(idx='a6',id,null))            as a5_cnt       
​
  from
    (
            
        select
            id
            ,create_time as fact_time          -- 触发时间
            ,'a1'                      as idx      -- 类型
            ,0 as amount                       --金额
        from temp_test_detail
        where create_time < '${0d_yyyy-MM-dd}'
​
        union all
            
        select
            id
            ,a2_time as fact_time          -- 触发时间
            ,'a2'                      as idx      -- 类型
            ,test_amount as amount                       --金额
        from temp_test_detail
        where a2_time < '${0d_yyyy-MM-dd}'
              )t1
)t0
​
​