Hive 基本教程

Hive SQL

Hive 笔记

hive distinct 去重及多个字段等优化用法

Hive SQL 数据操作(DML)详解 Hive SQL 数据操作(DML)详解


Hive SQL 的 DISTINCT 是去重指定字段之用,和 GRUOP BY 有类似的功能,与其对应的其实是 ALL,表示返回所有匹配的行,只是默认就是 ALL,常常使用时不会显性指定。

语法

......
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  ......

DISTINCT 在 SELECT 查询语句中,如上。

所有列去重

DISTINCT 后面跟随所有要去重的字段,如下:

SELECT DISTINCT user_id, order_id, status FROM t1

这样 DISTINCT 后的所有列重复的数据去除了。

hive 中,使用 DISTINCT 必须在 SELECT 的最前面,不能在 DISTINCT 的前面加列名,否则会报错。

还有另外去重所有列的方式是将所有列用小括号包在里面,并用 DISTINCT 修饰,如下代码等同于上面:

SELECT DISTINCT (user_id, order_id, status) FROM t1

DISTINCT 和聚合函数一起使用

DISTINCT 不能和聚合函数并列使用,否则会报错:

SELECT DISTINCT user_id, order_id, status, COUNT(order_id) FROM t1
FAILED: SemanticException [Error 10128]: Line 1:44 Not yet supported place for UDAF 'COUNT'

但是,DISTINCT 能和聚合函数嵌套使用:

SELECT COUNT(DISTINCT user_id) FROM t1

COUNT(DISTINCT col) 优化

DISTINCT 是比较耗性能的操作,如果能用 GROUP BY 代替尽量用它,因为 GROUP BY 的性能好于 DISTINCT。