1.数据量较大的情况下慎用count(distinct name)
问题:使用disticnt函数,所有的数据只会shuffle到一个reducer上,导致reducer数据倾斜严重易造成数据倾斜,
比如:男UV,女UV,淘宝一天30亿的PV,如果按性别分组,分配2个reduce,每个reduce处理15亿数据。
优化:建议使用group by 字段,分组之后再对该字段做次数统计;
hive去重有几种方法?distinct 、 group by
row_number 开窗函数 分组排序
pv 页面访问量
uv 用户访问量
vv 访客量 根据session
2.order by全局排序 & sort by “局部有序”(分区内部排序)
(1).order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)
只有一个reducer,会导致当数据输入规模较大时,需要较长的计算时间,影响效率.
如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,
原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。
(2).如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sort by只保证每个reducer的输出有序&