对大数据里distinct的使用总结:
只能放在第一个字段的前面,一个查询语句只能使用一次
为啥只能使用一次?
大数据里distinct去重是对所有查询字段的去重,所以只能出现一次
不方便使用的时候,可以使用group by 代替;
create table tmp.c1 as
select 1 as b,2 as c
union all
select 1 as b,2 as c;
select distinct b,c from tmp.c1; 结果是1,2
1.count(distinct)
select count(distinct column_name) from table_name where ...
对某些字段的去重统计,例:统计用户数量(统计去重的用户ID) count(distinct userId)
优化原因: 因为引入了DISTINCT,无法在map阶段利用combine对输出结果去重,导致shuffle任务量增大
错误解决办法:显式地增大Reduce Task个数来提高Reduce阶段的并发 set mapred.reduce.tasks=n
发现并不能增加Reduce Task个数,原因是Hive在处理count"全聚合(full aggredates)"时,会忽略用指定的Reduce Task个数,强制使用1.
正确解决办法:利用嵌套,增加MapReduce个数
不足: 不够灵活
select count(*) from (select distinct column_name from table_name where ...) t