【hive】去重操作

概述

在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;

猜你喜欢

转载自blog.csdn.net/TheSnowBoy_2/article/details/80135861