概述
在hive中,去重操作主要有两种:
- distinct
- group by
ditinct
该关键字的存在,决定了是否要去除重复的行。(有distinct,意味着取出规定的重复的行)
【去重规则】需要指出的是,去重的规则是根据后面的关键字进行的,比如:
- 如果col1,col2同时重复才会去重。即 col1重复 & col2 重复 –> 去重。
SELECT distinct col1, col2 FROM t1;
【必须修饰投影的全部字段】在一个select语句中,distinct一旦出现,那么一定得是修复全部选择的字段的。
正确的写法:
SELECT distinct col1, col2 FROM t1;
错误写法:(解析时报错,不符合语法规则)
SELECT col1, distinct col2 FROM t1;
PS:
【设计原因】如此设定的原因在于,当只根据部分字段去重后,一个去重字段组合可能对应多行,那么剩余非distinct的投影字段很难进行一定的选择,所以干脆定义出现distinct要么全修饰,要么不用distinct.
【group by 】相对于此,功能稍微扩展了一点,你可以操作非group by字段,但只能借助于聚合函数。
【与count 函数并用】count根据多列进行判断计数时,需要与distinct相结合,形式如下: (需要指出的是,只要col1与col2 中有一个值为空,则所对应的行不被计入count中)
【支持表达式】 distinct不仅支持列名,还支持表达式区分。
select count(distinct col1,col2) from t1;
group by
group by可用以去重,但是其设计的目的,在于统计、汇总,与聚合函数相结合。
(可以看作是 distinct 的增强版)
group by的使用形式:
- group by 涉及的表达式可以是列,或者是函数表达式等。
- condition中涉及的字段,必须在group by 中出现。
- 非group by字段,需要通过聚合函数才能出现在select的投影中。
GROUP BY groupByExpression (, groupByExpression)*
having condition;