- 一、如何快速确认某一字段是否有重复值
- 1、cnt 没有去重,order_cnt 去重, 如果得到结果相同,则表是没有重复
- 2、根据待确认字段进行分组,订单号不能有大于1的情况,就代表没有重复
- 3、如果数据有重复,如何查找出来重复的字段信息呢?
- 二、如何去除重复值
- 2.1 hive表中某些数据是整行的重复,而且字段过多时:
- 2.2 两行数据只有一个字段不一样:
- 2.3 当表中字段不多,而且数据是某些字段重复,可通过row_number():
- 2.4 在某些情况中我们不是需要全部字段,而是仅仅过滤出某些不重复的字段:
- 三、row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
因为Hive中没有主键,mysql严格要求主键,可以将待确认字段作为主键。
1、cnt 没有去重,order_cnt 去重, 如果得到结果相同,则表是没有重复select count(*) cnt ,count(distinct order_id) order_cnt from orders //结果: cnt order_cnt 3421083 34210832、根据待确认字段进行分组,订单号不能有大于1的情况,就代表没有重复
select order_id,count(1) from orders group by order_id having count(1)>1 //结果: order_id count(1) # 表示没有重复值3、如果数据有重复,如何查找出来重复的字段信息呢?
select pripid,count(1) from orders group by pripid having count(1)>1二、如何去除重复值 2.1 hive表中某些数据是整行的重复,而且字段过多时:
insert overwrite table stu_tab select distinct * from stu_tab;
通过过滤不同的行,将原表进行覆盖。
2.2 两行数据只有一个字段不一样:
根据情况我们将含有2的那行数据进行删除;
insert overwrite table sys_cus_hz_20210127 select distinct * from sys_cus_hz_20210127 where consumlevel != 2;2.3 当表中字段不多,而且数据是某些字段重复,可通过row_number():
insert overwrite table emp_tab select id,name,sal from ( select * , row_number() over(partition by id order by sal desc) rank from emp_tab)t1 where t1.rank=1;2.4 在某些情况中我们不是需要全部字段,而是仅仅过滤出某些不重复的字段:
select distinct id from stu_tab; #单个字段去重 select distinct id,name from stu_tab; #多个字段之间通过逗号去重三、row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
这行代码的意思是先对COL1列进行分组,然后按照COL2进行排序,row_number()函数是对分组后的每个组内记录按照COL2排序标号,我们最后取的时候就拿标号为1的一条记录,即达到我的需求。
SELECt *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee
SELECt * from( select *, Row_Number() OVER (partition by deptid ORDER BY salary desc) as rank FROM employee) t1 where t1.rank=1
只保留rank=1的数据。



