hive count distinct和group by

首先,Hive的group by和count(distinct)都是去除重复的数据,某种程度上来讲,二者产生的结果是同样的。大数据

    实例代码:code

select a,count(distinct b) from t group by a
select tt.a,count(tt.b) from (select a,b from t group by a,b)tt group by tt.a

上面两句代码产生的结果是同样的,可是二者从效率和空间复杂度上来说,是有很大的差异的。排序

    distinct会将b列全部的数据保存到内存中,造成一个相似hash的结构,速度是十分的块;可是在大数据背景下,由于b列全部的值都会造成以key值,极有可能发生OOM。内存

    group by会先把b列的值进行排序,若是以快速派序来讲的话,他的空间复杂度就是O(1),时间复杂度是O(nlogn),这样在大数据的环境下,只有排序阶段会比较慢,时间复杂度是O(nlogn)。hash

    二者比较来讲,distinct 耗费内存,可是效率极高,可是数据较大时,可能会产生OOM;group by若是在时间复杂度容许的状况下,能够展示出突出的空间复杂度的优点。效率

使用distinct会将全部的数据都shuffle到一个reducer里面,group by会分组,将数据分布到多台机器上执行。select

    最后,对于Hive来讲,含有distinct的HQL语句,若是遇到瓶颈,想要调优,第一时间都是想到用group by来替换distinct来实现对数据的去重。数据

相关文章
相关标签/搜索