hive rank 测试

[b]前言[/b]
最近在做数据的去重,想到一种类似于关系型数据库rank函数的方式,即获取topN(N=1)的方式,sql步骤如下:
1.数据分组,组内排序
2.对分组数据进行标记rank
3.获取rank<N的数据
[b]hive udf[/b]
hive中没有这种函数,需要自己编写udf函数,代码如下:

public final class TradeUDF extends UDF {
private int counter;
private String last_dp_id;
private String last_tid;
//多参数
public int evaluate(String dp_id, String tid) {
if (dp_id.equalsIgnoreCase(this.last_dp_id) && tid.equalsIgnoreCase(this.last_tid)) {
this.counter++;
}else{
this.counter = 0;
this.last_dp_id = dp_id;
this.last_tid = tid;
}
return this.counter;
}
//一个参数
public int evaluate(final String tid) {
if (!tid.equals(this.last_tid)) {
this.counter = 0;
this.last_tid = tid;
}
return this.counter++;
}
}

[b]小函数据量测试[/b]

select * from test2;
OK
a 1
a 4
a 6
b 87
b 3
b 100
c 10
d 90
d 9
a 3
a 3


SELECT a,b,rank
FROM (SELECT a,b,rank(a) rank
FROM (SELECT a,b
FROM test2 DISTRIBUTE BY a SORT BY b desc
) t1)
t2
WHERE rank <1

结果:

d 90 0
a 6 0
b 87 0
c 10 0

可以看到数据是准确的。
[b]大数据来量测试[/b]
数据总量:5033768
重复数据:2516884,即一半是重复数据
结果:
4194632
可以看到数据量是不对的。
[b]原因[/b]
大数据量时,rank方式去重数据结果不准确的原因还未确定,推测原因是:
distribute sort后相同数据被分在不同数据块中,在接下来sql读取的时候,相同数据没有被读进同一个rank函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值