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小表优化的更多相关文章

  1. 大数据开发主战场hive (企业hive应用)

    hive在大数据套件中占很的地位,分享下个人经验. 1.在hive日常开发中,我们首先面对的就是hive的表和库,因此我要先了解库,表的命名规范和原则 如 dwd_whct_xmxx_m 第1部分为表 ...

  2. 大数据技术之Hive

    第1章 Hive入门 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提 ...

  3. BAT推荐免费下载JAVA转型大数据开发全链路教程(视频+源码)价值19880元

    如今随着环境的改变,物联网.AI.大数据.人工智能等,是未来的大趋势,而大数据是这些基石,万物互联,机器学习都是大数据应用场景! 为什么要学习大数据?我们JAVA到底要不要转型大数据? 好比问一个程序 ...

  4. 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进

    点击上方 蓝字关注我们 作者 | 宋哲琦 ✎ 编 者 按 在不久前的 Apache  DolphinScheduler Meetup 2021 上,有赞大数据开发平台负责人 宋哲琦 带来了平台调度系统 ...

  5. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  6. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  7. 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库

    1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...

  8. 大数据开发实战:Hive表DDL和DML

    1.Hive 表 DDL 1.1.创建表 Hive中创建表的完整语法如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS]  table_name [ (col_nam ...

  9. 大数据开发实战:Spark Streaming流计算开发

    1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...

随机推荐

  1. [CF580E]Kefa and Watch

    题目大意: 维护一个由'0'~'9'构成的字符串,支持以下两种操作: 1.将指定区间内的所有字符修改为同一指定字符. 2.询问$x$是否为指定区间内的循环节. 思路: 建立一棵线段树,维护每个子串的哈 ...

  2. tomcat配置问题:访问http://localhost:8080/ 遇到 Access Error: 404

    win7: 8080端口已经被其他应用使用,比如nixxxxxxxxxxxxx When I had an error Access Error: 404 -- Not Found I fixed i ...

  3. j.u.c系列(08)---之并发工具类:CountDownLatch

    写在前面 CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待“:用给定的计数 初始化 CountDownLatch.由于调用了 countDo ...

  4. Hadoop化繁为简(一)-从安装Linux到搭建集群环境

    简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...

  5. CentOS的epel源rpm最新下载地址获取技巧

    最近发现以前的的脚本上安装epel不起作用,最后发现是官方更新了,且每次更新都会把以前旧的删除. 鉴于上面这种情况,不建议安装rpm包,直接转投阿里云的镜像站点,下载文件替换,阿里云的好处是不改文件名 ...

  6. nginx优化(转)

    Puppet利用Nginx多端口实现负载均衡 对 Nginx SSL 的性能进行调整 一.nginx 配置文件中基本设置: 1.  worker_processes 8; 2.  worker_cpu ...

  7. Oracle数据库备份还原工具之Expdp/IMPdp

    使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...

  8. USBDM RS08/HCS08/HCS12/Coldfire V1,2,3,4/DSC/Kinetis Debugger and Programmer -- Driver Install

    Installation of USBDM USB drivers for Windows There are four installers provided: USBDM_Drivers_x_x_ ...

  9. AES CBC/CTR 加解密原理

    So, lets look at how CBC works first. The following picture shows the encryption when using CBC (in ...

  10. 理解 process.initgroups(user, extra_group)

    这个函数是对 linux  C函数 initgroups()  的包装 node.js 官方文档非常含糊,还是看 linux C函数文档的解释!非常清楚明确. The initgroups() fun ...