HiveSQL distinct去重的优化介绍

本文介绍了在大数据处理中,HiveSQL的distinct去重使用限制及其优化方法。通过对比count(distinct)在不同数据量和粒度下的效率,提出利用嵌套查询和Map Join等策略提高性能。此外,强调了在使用distinct时每个字段需指定表名,并讨论了Hive的Map Join优化,尤其是在0.7版本后自动转换Map Join的特性。
摘要由CSDN通过智能技术生成

对大数据里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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值