hive使用技巧(二)——共享中间结果集
2015-11-19 14:30
155 查看
hive使用技巧(二)——共享中间结果集,很多hive的Job用到的中间结果集 ,存在“亲缘”关系,多作业用共用输入或输出。
1、优化前的SQL
可以看,上面的SQL针对同一源表的数据查询了三次,浪费了系统的资源,相同的源完全可以通用。
2、优化后的SQL
抽出公共数据
利用临时表,替换原SQL的公共部分:
3、共享中间结果集
本质就是降IO,减少MR阶段中大量读写磁盘及网络IO的压力。
1、优化前的SQL
SELECT COUNT(*) pv FROM ( SELECT cookieid, userid, to_date(DATETIME) day1 FROM ods.tracklog_5min WHERE DAY>='20151001' AND DAY<='20151031' AND lower(requesturl) IN ('http://chat.hexun.com/', 'http://zhibo.hexun.com/'))t1 INNER JOIN ( SELECT cookieid, to_date(DATETIME) day2 FROM ods.tracklog_5min WHERE DAY>='20151001' AND DAY<='20151031' AND (( lower(requesturl) LIKE 'http://zhibo.hexun.com/%' OR lower(requesturl) LIKE 'http://chat.hexun.com/%') AND requesturl LIKE '%/default.html%'))t2 ON t1.cookieid=t2.cookieid AND t1.day1=t2.day2 INNER JOIN ( SELECT cookieid, to_date(DATETIME) day3 FROM ods.tracklog_5min WHERE DAY>='20151001' AND DAY<='20151031' AND ( ( lower(requesturl) LIKE 'http://px.hexun.com/%' AND lower(requesturl) LIKE '%/default.html%' ) OR ( lower(requesturl) LIKE 'http://px.hexun.com/pack/%' AND lower(requesturl) LIKE '%.html%' ) OR ( lower(requesturl) LIKE 'http://px.hexun.com/p/%' AND lower(requesturl) LIKE '%.html%' ) ))t3 ON t1.cookieid=t3.cookieid AND t1.day1=t3.day3 LEFT JOIN stage.saleplatform_productvisitdetail_temp t4 ON t1.userid=t4.userid WHERE t4.createtime>t1.day1 OR t4.userid IS NULL;
可以看,上面的SQL针对同一源表的数据查询了三次,浪费了系统的资源,相同的源完全可以通用。
2、优化后的SQL
抽出公共数据
create table default.tracklog_10month as select * from ods.tracklog_5min WHERE DAY>='20151001' AND DAY<='20151031';
利用临时表,替换原SQL的公共部分:
SELECT COUNT(*) pv FROM ( SELECT cookieid, userid, to_date(DATETIME) day1 FROM default.tracklog_10month WHERE lower(requesturl) IN ('http://chat.hexun.com/', 'http://zhibo.hexun.com/'))t1 INNER JOIN ( SELECT cookieid, to_date(DATETIME) day2 FROM default.tracklog_10month WHERE (lower(requesturl) LIKE 'http://zhibo.hexun.com/%' OR lower(requesturl) LIKE 'http://chat.hexun.com/%') AND requesturl LIKE '%/default.html%')t2 ON t1.cookieid=t2.cookieid AND t1.day1=t2.day2 INNER JOIN ( SELECT cookieid, to_date(DATETIME) day3 FROM default.tracklog_10month WHERE ( ( lower(requesturl) LIKE 'http://px.hexun.com/%' AND lower(requesturl) LIKE '%/default.html%' ) OR ( lower(requesturl) LIKE 'http://px.hexun.com/pack/%' AND lower(requesturl) LIKE '%.html%' ) OR ( lower(requesturl) LIKE 'http://px.hexun.com/p/%' AND lower(requesturl) LIKE '%.html%' ) ))t3 ON t1.cookieid=t3.cookieid AND t1.day1=t3.day3 LEFT JOIN stage.saleplatform_productvisitdetail_temp t4 ON t1.userid=t4.userid WHERE t4.createtime>t1.day1 OR t4.userid IS NULL;
3、共享中间结果集
本质就是降IO,减少MR阶段中大量读写磁盘及网络IO的压力。
相关文章推荐
- 树、森林及二叉树的相互转换 – 数据结构和算法50
- Java如何判断socket是否已经断开
- 指针遇到的问题,请指教
- Centos下彻底删除oracle
- java入门 第三季2
- Android App监听软键盘按键的三种方式
- 「价值」我真不是买不起,而是要把钱花在了更有意义的地方
- [置顶] 谷歌安卓UI自动化测试策略
- 搭建redis单机集群
- 关于iOS去除数组中重复数据的几种方法
- iOS 账号申请流程
- 求一个思路和一个定义的方法
- 大数相乘算法
- OutputCache各参数的说明
- webrtc 丢包反馈之 rtcp goog-remb
- 关于Oracle将小于1的数字to_char后丢掉0的解决办法
- stacktach和ceilometer
- Kibana User Guide [4.2] » Kibana Plugins
- tasklet与workqueue的区别及底层实现区别
- Callable,Runnable比较及用法