Hive SQL 数据去重简析

来源:互联网 发布:淘宝装修购买 编辑:程序博客网 时间:2024/06/11 13:12

    hive的很多表中或在执行表的join命令后,有可能在若干字段上存在重复现象,为了后续业务的需要,减少计算量,需要对表的重复记录去重,最近几天,在学习使用HQL的应用,也尝试着处理表的重复记录问题。

1.group by(不推荐使用在去重场景)

    最开始不熟悉HQL的其他命令,所以采用了该命令用来去重,在某些场景下group by可以用来去重,但更多的是用来进行分组,

且group by在去重中应用比较麻烦。

    Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

    注意:group by 是先排序后分组;

    举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术

           select DepartmentID as '部门名称',COUNT(*) as '个数' from BasicDepartmentgroup by DepartmentID

    这个就是使用了group by +字段进行了分组,其中我们就可以理解为我们按照了部门的名称ID DepartmentID将数据集进行了分组,然后再进行各个组的统计数据分别有多少;

 如果不用count(*) 而用类似下面的语法
                       select DepartmentID, DepartmentName from BasicDepartment group by DepartmentID

将会出现错误:

           消息 8120,级别 16,状态 1,第 1 行

    选择列表中的列'BasicDepartment.DepartmentName' 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。

    这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。

    出现的错误详解:咱们看看group by 的执行的过程,先执行select的操作返回一个程序集,然后去执行分组的操作,这时候他将根据group by 后面的字段进行分组,并且将相同的字段并称一列数据,如果group by 后面没有这个字段的话就要分成好多的数据。但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的数据系统不知道将数据放入哪里,所以就出现此错误

    目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数

2.采用row_number() over(partition by .... )(选择分区条件中第几条数据输出,若该序列没有,则不输出)

    

下面以班级成绩表t2来说明其应用

t2表信息如下:

name    class    s
cfe         2        74
dss         1        95
ffd         1        95
fda        1        80
gds        2        92
gf           3       99
ddd       3        99
adf         3        45
asdf        3        55
3dd         3        78
    获取每个班级的最高分,只保留一条记录
    select*from                                                                      
    ( select  class, s, row_number()over(partition by class order by s desc) mm from t2
    )                                                                           
    where mm=1

1       95        1  --95
有两名但是只显示一个
2       92        1
3       99        1 --99有两名但也只显示一个



原创粉丝点击