hive函数之去重

211 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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