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。