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

原创 2015年11月19日 14:30:51

相关文章推荐:

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

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

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



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


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的压力。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hive共享中间结果集

场景:如果有多个作业同时用到了相同的中间结果集 重量级优化:作业的“亲缘”关系(也就是有相同依赖的表,就是from后面相同的), 目的是:多作业共用输入或输出,输入就是用中间结果集作为下一阶段的输...

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

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

Hive中SQL的优化技巧

Hive中SQL的优化技巧,核心思想是避免数据倾斜。

JDBC那些事(二)——查询结果集_ResultSet

接上一篇,JDBC的查询返回值相对复杂一点,所以单独写。上一篇写到stmt.excuteUpdate(sql);执行结果返回的是int类型的值。此处的sql语句为非查询语句。而如果要执行查询语句则需要...

支持连接池和结果集缓存的MySQL数据库JDBC通用框架的轻量级封装(二)——向上封装

“SQL对象”级别的封装方案,即以一条SQL语句的粒度为单位,将其包装成一个DBObject,利用@DBCondition来声明SQL的输入条件、@DBResult来声明查询所返回的结果,Connec...

ORACLE编程的套路——结果集实现按匹配度优先

何谓按匹配度优先?打个比方,一款轮胎商品仅适用与奥迪A6L的车,而另一款充气泵则适用于所有品牌的车。 当我们筛选适用于奥迪A6L的商品时,专属于奥迪的商品和适用于所有品牌的商品都应该符合条件, 但专属...

简简单单储存过程——循环一个select结果集

2、示例需求 : 将表from_data 的select结果集循环插入到表to_data;                                 伪代码:   while 循环 sele...

支持连接池和结果集缓存的MySQL数据库JDBC通用框架的轻量级封装(一)——粗略实现

支持连接池和结果集缓存的MySQL数据库JDBC通用框架的轻量级封装(一)——粗略实现 (1)数据库连接池构建方法 1、利用Apache的Commons Pool通过继承BasePooledO...

C#连接MySQL数据库实现DataGridView定时更新数据——多结果集返回

本文讨论的主要问题是C#连接MySQL数据库实现 select 多结果集返回,并将结果用DataGridView定时更新。 一、实现中遇到的问题 1、刷新DataGridView显示时出错或者出现大红...

ORACLE编程的套路——结果集的动态排序

说到动态排序,可以直接理解为按照指定的列及方向进行排序并返回结果集。 可能有人要说,动态生成SQL,返回游标不就O了吗。思路如此,但是途径还是会有一些误区,故分享在此。 按照ORACLE的语法:OPE...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hive使用技巧(二)——共享中间结果集
举报原因:
原因补充:

(最多只允许输入30个字)