SQL调优
count(distinct user_id) 和 group by user_id 之后 求 count 两者有什么区别?
首先要清楚,count(distinct) 的原理机制,首先他是将数据通过map端发往一个reduce,之后reduce接收到数据之后,会将数据放入到 hashset中去重,之后cleanUp() 方法,在执行最后的逻辑,比如:计算hashset的size等。
这里就出现了一些问题
1)数据都发往一个reduce会造成数据倾斜,
2)程序从分布式变成单机程序,影响效率
3)程序执行过程中,只产生一个job
但也不是绝对的,当数据量很小的时候,此时我们并不需要采分布式执行,一个job运行足矣,但是,当数据量比较大的时候,这时count(distinct) 就暴露除了大大的弊端,所以,此时,不应该采用此法来实现去重
group() by count() 当数据量比较大的时候,采用此法,先分组,这时已经在map端实现了去重机制,之后数据发往reduce 数据量已经变得很小了,并且此法涉及到shuffle ,所以reduce的压力不会集中在某个上,并且会产生多个job。
group() by count() 一定比count(distinct) 性能要好吗?
不一定,当数据量比较大的时候采用group() by count() 会比count(distinct) 要好,但是在数据量比较小的时候,一个job就可以处理,没必要用两个job,也没必要shuffle,所以调优看情况而定
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Pencil!
评论