分享

Hive数据倾斜(大表join大表)【优化】

bob007 2015-5-12 23:31:26 发表于 实操演练 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 26 152163
wxj19911117 发表于 2018-9-11 16:37:33
[mw_shl_code=sql,true]select count(*) from original_basks_tof_20180910;
--10961116
select count( *)
from original_basks_tof_20180910 a
where a.cust_code ='';
--3294740

create table original_basks_tof_20180910_add
as
select a.*,b.cust_id
from original_basks_tof_20180910 a
left join bnh_customers b
on case when a.cust_code = '' then concat('harb',rand()) else a.cust_code end = b.cust_code ;
--547.206 seconds
--10961116

create table original_basks_tof_20180910_add_2
as select a.*,b.cust_id
from original_basks_tof_20180910 a
left join bnh_customers b
on  a.cust_code = b.cust_code ;
--358.698 seconds
--10961116


create table original_basks_tof_week_id_add as
select distinct a.*, b.cust_id as cust_id_new,a.bask_id +400200252929106 as bask_id_new
from original_basks_tof_week_id a
join
original_basks_tof_20180910_add_2 b
on a.bask_code = b.bask_code
--10688474[/mw_shl_code]
你好,为什么我的速度反而不入正常的情况呢,是数据量小了吗
回复

使用道具 举报

wxj19911117 发表于 2018-9-25 11:12:56
javaanddonet 发表于 2018-4-24 10:42
有一个问题:
from trackinfo a
left outer join pm_info b

楼主的意思是到时再insert左表那些不匹配的数据,同时上面的数据也能谓词下推吗。。。感觉hive的优化好难啊,很多实际的结果和网上看到的不一样
回复

使用道具 举报

About380713049 发表于 2018-9-28 21:34:08
学习了,感谢分享,非常好的资源
回复

使用道具 举报

qq941199 发表于 2018-10-16 14:52:39
感谢楼主分享的经验,有点启发
回复

使用道具 举报

刘鑫 发表于 2018-11-6 17:39:07
楼主,请问大数量下 count(distinct )...group by 怎么优化。例如。select a,count(b),count(distinct c),count(distinct d) from tablename group by a
回复

使用道具 举报

s060403072 发表于 2018-11-6 18:59:33
刘鑫 发表于 2018-11-6 17:39
楼主,请问大数量下 count(distinct )...group by 怎么优化。例如。select a,count(b),count(distinct c), ...

老铁不可能这么多count的,要么统计行,要么统计其中一个。这么多count不符合逻辑。
由于有count,因此默认是有一个reducer的,这样效率就会很慢,所以可以使用分组分别统计。
如果你想统计,是不能用a来进行分组的。可以自己制作一个flag来分组。
count由于只有一个reduce来统计。因此如果不优化会非常的慢。那么怎么优化那?
既然整个只产生一个reduce,那么我们就把他们分别统计,然后在统计。那么如何实现分别统计,通过group by分组。那么分组不能按照被统计的分组。可以制造一个flag,来进行分组。
首先我们第一层:
select cast(rand() * 10 as bigint) flag,A from tablename group by A
我们记为表t1
1层使用随机数作为分组依据,同时使用group by A保证去重。

第二层,每个分组进行统计
select count(*) tc, tag  from t1 group by   tag
上面记为t2

第三层对分组结果求和。
SELECT    SUM(tc) FROM t2

整合为一个sql为:
SELECT SUM(tc) FROM (select count(*) tc, tag  from (select cast(rand() * 10 as bigint) flag,A from  tablename group by  A )t1 group by tag )t2;
回复

使用道具 举报

123
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条