zoukankan      html  css  js  c++  java
  • Hive 的 map join

    学习自 http://blog.csdn.net/xqy1522/article/details/6699740

    1. Map Join 的使用场景:

    • 关联操作中有一张表非常小
    • 不等值的链接操作

    2. 语法:

    使用 hint 的方式指定join时使用mapjoin。

    select   /*+ mapjoin(c)*/    -- hint
       c.tag,b.yemaozi_pre 
    from
    (select 
        row_number() over(partition by 1 order by yemaozi_pre)  yemaozi_rank,
        yemaozi_pre 
     from  customer_purchase_time_pre
    ) b       -- 大表                              
    join
    (select 
        count(buyer_nick) total_buyer,'yemaozi' as tag 
     from customer_purchase_time_pre
    ) c        -- 小表,只有一行
    where b.yemaozi_rank=round(c.total_buyer*0.9);
    

    用时才发现了个细节:

          /*+mapjoin( ) */  这个语法里面的c  是join的小表的名字!

    3. 原理:

     MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce,运行的效率也会高很多。 

    4. 分析:

    • 例子中的小表参与join,没使用map join时,会导致数据倾斜严重。某个reduce上落太多数据,reduce时内存会严重占用,甚至不足。
    • 不等连接时,reduce会进行笛卡儿积,效率很低。
    • 使用map join后  join操作会在map阶段完成。

    如果join数据两大,加上如下参数避免内存溢出:

    set mapreduce.reduce.shuffle.input.buffer.percent =0.6;
    set mapreduce.reduce.shuffle.parallelcopies = 5;
     
  • 相关阅读:
    学习进度(十一)
    学习进度(十)
    人月神话阅读笔记1
    SQL SUM() 函数
    SQL GROUP BY 语句
    SQL HAVING 子句
    SQL UCASE() 函数
    SQL LCASE() 函数
    SQL MID() 函数
    SQL LEN() 函数
  • 原文地址:https://www.cnblogs.com/skyEva/p/5632374.html
Copyright © 2011-2022 走看看