Hive 组内计无重复数,追加每条记录后面

今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现。

示例表数据:

需求逻辑:

给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count)。

示例结果:

Mysql 超级简单的一句:
select
     id,
     num,
     p1,
     p2,
     count(distinct num) over (PARTITION by p1,p2) as f
from test_z;
Hive里

会报distinct有问题,去掉的话,明显与要求逻辑不符合啊。

想了一会还是用 dense_rank 和 join 实现了。以后再发掘其他的简单方法吧:

select 
        b.id,
        b.num,
        b.p1,
        b.p2,
        a.f
from
(
    select
           p1,
           p2,
           max(f) as f
    from
   ( 
      select
            id,
            num,
            p1,
            p2,
            dense_rank() over  (PARTITION by p1, p2 order by num) as f
       from test_z
    )a1
    group by p1,p2
 )a
 join  test_z b
      on a.p1=b.p1 and a.p2=b.p2;

上面的a表太复杂,还可以用简单的group by 和 count(distinct)把a表逻辑换了。

    select
           p1,
           p2,
           count(distinct num) as f
    from test_z
    group by p1,p2
posted on 2017-04-01 14:41  Suckseedeva 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/skyEva/p/6655946.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值