select distinct a from t1;
select a from t1 group by a;
低版本hive
执行计划:
# distinct
Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS
# group by
Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 10056.7 sec HDFS Read: 119074266583 HDFS Write: 53469 SUCCESS
默认情况下,distinct会被hive翻译成一个全局唯一reduce任务来做去重操作,因而并行度为1
而group by则会被hive翻译成分组聚合运算,会有多个reduce任务并行处理,每个reduce对收到的一部分数据组,进行每组聚合(去重)
高版本hive
高版本的hive,对distinct进行了优化,其执行计划和group by的一样,已经不会出现低版本的一个reduce现象,运行时间也相差无几。(已知hive2.3.0 已优化)
但是不明确用的hive版本是否优化了distinct的情况下,用group by 进行去重是不会有问题的。