今天无意中碰到一个很简单的计算逻辑,但是用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