一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
在使用hive函数做数据开发过程中,经常需要处理数据重复的情况,比如使用到union all对数据进行聚合后,虽然会默认去掉重复的数据,但是只会对一模一样的数据进行去重,所以还要另外加上去重复的逻辑。今天就介绍几种hive中常用的去重函数。
一、GROUP BY
针对数据量较小的,使用 DISTINCT,数据量大的时候,使用 GROUP BY。
group by不是只对一列去重,会对后面跟着的所有字段都去重复,并且在select中的字段要包含group by后面的所有字段,并且多的字段一定是一种聚合形式,可以是用sum,count等函数,或者concat_ws这样的字段组合函数。可以将需要聚合的字段单独领出来放在concat_ws的括号里面,然后用某一个分隔符进行分离,最后这些数据就会在一行记录中展示出来的。
select
t0.id
,t0.student_id
,concat_ws(',',collect_set(t1.grade))
from student_tmp t0
left join grade_tmp t1
on t1.pt = '20220328110000' and t1.id = t0.student
where t0.pt = '20220328110000' and t0.id = '10000111'
group by t0.id,t0.student_id
二、DISTINCT
distinct放在需要去重的字段最前面,其后的所有字段都会做去重复处理。
在聚合函数中使用distinct可以对null值也进行过滤处理,但是单独使用的话,就不会过滤掉null值了,所以在返回的结果集中是会包含null值的。
同时distinct和group by也可以结合着一起使用,这时候可以起到对单一某个字段进行去重复,然后对所有数据按照某几个字段进行分组排序去重复。
SELECT
COUNT(distinct student_id) AS same_student_num
,uc_id AS uc_id
FROM tmp
WHERE student_id <>0
GROUP BY uc_id
三、窗口函数
大家不知道这个窗口函数也有去重复的作用吧,其中不仅可以对uid去重复处理,也可以做排序,输出序号字段rk。
select m.name,student_id
from (
select name
,grade_id,ROW_Number() over(partition by student_id order by uid) rk
from db.t_grade
) m
where m.rank=2