美文网首页
Hive优化实践2-大表join小表优化

Hive优化实践2-大表join小表优化

作者: 多彩海洋 | 来源:发表于2019-08-21 09:28 被阅读0次

4、大表join小表优化
      和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦。

首先介绍大表join小表优化。以销售明细表为例来说明大表join小表的场景。

假如供应商进行评级,比如(五星、四星、三星、二星、一星),此时因为人员希望能够分析各供应商星级的每天销售情况及其占比。

开发人员一般会写出如下SQL:

select seller_star, count(order_id) as order_cnt

from

(select order_id,seller_id from sales_detail_table where partition_value='20181010' ) a

left outer join

( select seller_id, seller_start from dim_seller where partition_value =''20181010' ) b

on a.seller_id = b.seller_id

group by b.seller_star;

现实世界的二八准则将导致订单集中在部分供应商上,而好的供应商的评级通常会更高,此时更加加剧了数据倾斜的程度,如果不加以优化,上面SQL将会耗费很长时间,,甚至运行不出结果。

通常来说,供应商是有限的,比如上千家,上万家,数量不会很大,而销售明细表比较大,这就是典型的大表join小表的问题,可以通过mapjoin的方式来优化,只需要添加mapjoin hint即可,

优化后的SQL如下:

select /+mapjoin(b)/

seller_star, count(order_id) as order_cnt

from

(select order_id,seller_id from sales_detail_table where partition_value='20181010' ) a

left outer join

( select seller_id, seller_start from dim_seller where partition_value =''20181010' ) b

on a.seller_id = b.seller_id

group by b.seller_star;

/+mapjoin(b)/ 即是mapjoin hint,如果需要多个mapjoin多个表,则格式为:/+mapjoin(b,c,d)/.。 Hive对于mapjoin是默认开启的,设置参数为:

Set hive.auto.convert.join = true;

mapjoin优化是在Map阶段进行join,而不是通常那样在Reduce阶段按照join列进行分发后在每个Reduce节点上进行join,不需要分发也就没有倾斜的问题,相反,Hive会将小表

全量复制到每个Map任务节点(对于本例是dim_seller表,当然进全量复制b表 sql指定的列),然后每个Map任务节点执行lookup小表即可。

从上面的分析可以看出,小表不能太大,否则全量复制分发得不偿失,实际上Hive根据参数hive.mapjoin.smalltable.size(0.11.0版本后是hive.auto.convert.join.nonconditionaltask.size) 来确定小表的

大小是否满足条件(默认25MB),实际中此参数允许的最大值可以修改,但是一般最大不能超过1GB(太大的话Map任务所在的节点内存会撑爆,Hive会报错。另外需要注意的是,HDFS显示的文件

大小是压缩后的大小,当实际加载到内存的时候,容量会增大很多,很多场景下会膨胀10倍)。

相关文章

  • Hive优化实践2-大表join小表优化

    4、大表join小表优化和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjo...

  • Hive优化实践3-大表join大表优化

    5、大表join大表优化如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大...

  • 数仓--Hive-面试之Hive优化策略

    Hive的优化策略大致分为:配置优化(hive-site.xml和hive-cli执行前配置)、表优化、hive数...

  • 【Hive】优化

    分区表的设计和优化 普通表结构问题 使用分区表可以优化上述查询问题 分桶表的设计和优化 Join问题 分桶表设计 ...

  • hive大表优化

    转自http://www.aboutyun.com/thread-13077-1-1.html 业务背景 用户轨迹...

  • hive中所有join连接

    内连接:inner join --join优化:在进行join的时候,大表放在最后面 --但是使用/*+strea...

  • MYSQL优化杂谈五,表结构设计优化

    模型设计 适度冗余,让Query尽量减少Join 大字段垂直拆分summary表优化(表的垂直拆分) 大表的水平拆...

  • Hive优化实践1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关。 Hive的优化分为join相关的优化和join无关的优...

  • Hive优化

    这里从四个方面对 Hive 常用的一些性能优化进行了总结。 一 : 表设计层面优化 利用分区表优化 分区表 是在某...

  • Hive-Spark-Flink 大小表join

    在大数据离线批处理中,需求【大表(事实表)与小表(维度表)】关联字段,进行分析 Hive 默认开启Map端Join...

网友评论

      本文标题:Hive优化实践2-大表join小表优化

      本文链接:https://www.haomeiwen.com/subject/qsnvsctx.html