hive使用技巧(二)——共享中间结果集

来源:互联网 发布:手机淘宝买家改差评 编辑:程序博客网 时间:2024/05/14 20:49

相关文章推荐:

hive使用技巧(一)自动化动态分配表分区及修改hive表字段名称
hive使用技巧(二)——共享中间结果集
hive使用技巧(三)——巧用group by实现去重统计

hive使用技巧(四)——巧用MapJoin解决数据倾斜问题

Hive使用技巧(五)—— 一行转多行,多行转一行



hive使用技巧(二)——共享中间结果集,很多hive的Job用到的中间结果集 ,存在“亲缘”关系,多作业用共用输入或输出。


1、优化前的SQL

SELECT    COUNT(*) pvFROM    (        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%'))t2ON    t1.cookieid=t2.cookieidAND t1.day1=t2.day2INNER 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%' ) ))t3ON    t1.cookieid=t3.cookieidAND t1.day1=t3.day3LEFT JOIN    stage.saleplatform_productvisitdetail_temp t4ON    t1.userid=t4.useridWHERE    t4.createtime>t1.day1OR  t4.userid IS NULL;

可以看,上面的SQL针对同一源表的数据查询了三次,浪费了系统的资源,相同的源完全可以通用。


2、优化后的SQL

抽出公共数据

create table default.tracklog_10month as   select * from  ods.tracklog_5minWHERE  DAY>='20151001' AND DAY<='20151031';

利用临时表,替换原SQL的公共部分:

SELECT    COUNT(*) pvFROM    (        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%')t2ON    t1.cookieid=t2.cookieidAND t1.day1=t2.day2INNER 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%' ) ))t3ON    t1.cookieid=t3.cookieidAND t1.day1=t3.day3LEFT JOIN    stage.saleplatform_productvisitdetail_temp t4ON    t1.userid=t4.useridWHERE    t4.createtime>t1.day1OR  t4.userid IS NULL;

3、共享中间结果集

本质就是降IO,减少MR阶段中大量读写磁盘及网络IO的压力。




1 0