SELECT COUNT(DISTINCT USER_ID) FROM STU
上述sql会将所有USER_ID都shuffle到一个reduce中,如果数据量很大时,速度会变慢。
SELECT COUNT(*) FROM (SELECT USER_ID FROM STU GROUP BY USER_ID)
上述sql会根据group by 分组的结果产生多个reduce,然后并行执行,数据量很大时速度会变快。
我们也可以设置参数来规定多少个reduce
set mapred.reduce.tasks=100; // 设置reduce个数为100
结论:当数据量不大时推荐使用distinct,数据量大时使用group by