hive.map.aggr=true;在map中会做部分聚集操作,效率更高但需要更多的内存。
hive.groupby.skewindata=true:数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob 中,
Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key
有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到
Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
但是两者组合使用,计算pv时候会出现错误,现象如下四个sql
前3个看问题,最后一个改进
一
set hive.groupby.skewindata=false ;
set hive.map.aggr = true;
select dt,’整体’ as os,count(1) ,count(distinct device_id)
from ods_cre_news_click
where ‘20180401’<=dt and dt<=’20180418′ and pagetype=’tianyi_nvideo’ and channel=’news_video’ and event_method !=’Android_Lite’
group by dt
20180401 整体 394384 88374
20180402 整体 350275 83083
20180403 整体 362113 84762
20180410 整体 355632 84843
20180404 整体 362981 86480
20180411 整体 371531 95118
20180405 整体 407410 92178
20180412 整体 419627 108835
20180406 整体 386203 88369
20180413 整体 456934 114080
20180407 整体 381992 87484
20180414 整体 480010 115757
20180408 整体 366030 86030
20180415 整体 459180 111333
20180409 整体 348939 82524
20180416 整体 418914 105665
20180417 整体 430969 105115
20180418 整体 426462 102444
二
set hive.groupby.skewindata=true ;
set hive.map.aggr = false;
select dt,’整体’ as os,count(1) ,count(distinct device_id)
from ods_cre_news_click
where ‘20180401’<=dt and dt<=’20180418′ and pagetype=’tianyi_nvideo’ and channel=’news_video’ and event_method !=’Android_Lite’
group by dt
20180401 整体 394384 88374
20180402 整体 350275 83083
20180403 整体 362113 84762
20180410 整体 355632 84843
20180404 整体 362981 86480
20180411 整体 371531 95118
20180405 整体 407410 92178
20180412 整体 419627 108835
20180406 整体 386203 88369
20180413 整体 456934 114080
20180407 整体 381992 87484
20180414 整体 480010 115757
20180408 整体 366030 86030
20180415 整体 459180 111333
20180409 整体 348939 82524
20180416 整体 418914 105665
20180417 整体 430969 105115
20180418 整体 426462 102444
三
set hive.groupby.skewindata=true ;
set hive.map.aggr = true;
select dt,’整体’ as os,count(1) ,count(distinct device_id)
from ods_cre_news_click
where ‘20180401’<=dt and dt<=’20180418′ and pagetype=’tianyi_nvideo’ and channel=’news_video’ and event_method !=’Android_Lite’
group by dt
20180401 整体 267833 88374
20180402 整体 246562 83083
20180403 整体 246095 84762
20180410 整体 242038 84843
20180404 整体 253287 86480
20180411 整体 265535 95118
20180405 整体 279676 92178
20180412 整体 298332 108835
20180406 整体 273046 88369
20180413 整体 325518 114080
20180407 整体 257079 87484
20180414 整体 324205 115757
20180408 整体 253223 86030
20180415 整体 319272 111333
20180409 整体 248462 82524
20180416 整体 281923 105665
20180417 整体 289144 105115
20180418 整体 280593 102444
四:改进,把count改为sum
set hive.groupby.skewindata=true ;
set hive.map.aggr = true;
select dt,’整体’ as os,sum(1) ,count(distinct device_id)
from ods_cre_news_click
where ‘20180401’<=dt and dt<=’20180418′ and pagetype=’tianyi_nvideo’ and channel=’news_video’ and event_method !=’Android_Lite’
group by dt
20180401 整体 394384 88374
20180402 整体 350275 83083
20180403 整体 362113 84762
20180410 整体 355632 84843
20180404 整体 362981 86480
20180411 整体 371531 95118
20180405 整体 407410 92178
20180412 整体 419627 108835
20180406 整体 386203 88369
20180413 整体 456934 114080
20180407 整体 381992 87484
20180414 整体 480010 115757
20180408 整体 366030 86030
20180415 整体 459180 111333
20180409 整体 348939 82524
20180416 整体 418914 105665
20180417 整体 430969 105115
20180418 整体 426462 102444