前言
最近在做数据的去重,想到一种类似于关系型数据库rank函数的方式,即获取topN(N=1)的方式,sql步骤如下:
1.数据分组,组内排序
2.对分组数据进行标记rank
3.获取rank<N的数据
hive udf
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++;
}
}
小函数据量测试
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
可以看到数据是准确的。
大数据来量测试
数据总量:5033768
重复数据:2516884,即一半是重复数据
结果:
4194632
可以看到数据量是不对的。
原因
大数据量时,rank方式去重数据结果不准确的原因还未确定,推测原因是:
distribute sort后相同数据被分在不同数据块中,在接下来sql读取的时候,相同数据没有被读进同一个rank函数。
分享到:
相关推荐
TPCDS Hive基准测试流程完整总结;
HIVE实战测试数据HIVE实战测试数据HIVE实战测试数据HIVE实战测试数据
hive造数据
大数据Hive测试数据uaction.rar,包含了用户操作记录,为文件大小为300余M,包含800W条数据。
hive 操作相关的测试数据集hive
文章Hive面试题SQL测试题目所需数据,包含建表语句 测试数据等等...................
这个是hive测试数据.
hive测试题(包含万级测试数据文件)
文章Hive面试题SQL测试题目所需数据,包含建表语句 测试数据等等...................
一种基于数据仓库工具Hive组件的测试方法及系统.pdf
Hive 性能测试程序,https://github.com/hortonworks/hive-testbench 编译
kerberos认证hive连接代码,springmvc配置加上java触发认证kerberos认证
hive-testbench-hive14.zip 大数据TPCDS自动测试脚本
5.安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下 如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行) mysql -uroot -p #(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址...
hive hive hive hive hive hive hive hive hive hive hive hive
使用dbeaver或者其他数据库管理工具连接hive时使用到的驱动
hive服务的测试代码源码
使用hive3.1.2和spark3.0.0配置hive on spark的时候,发现官方下载的hive3.1.2和spark3.0.0不兼容,hive3.1.2对应的版本是spark2.3.0,而spark3.0.0对应的hadoop版本是hadoop2.6或hadoop2.7。 所以,如果想要使用高...
hive中分组取topN、row_number、rank和dense_rank使用介绍
hive-jdbc