一、什么是分桶表

分桶表,比普通表或者分区表有着更为细粒度的数据划分。
举个例子,每天产生的日志可以建立分区表,每个分区在 hdfs 上就是一个目录,这个目录下包含了当天的所有日志记录。
而分桶表,可以进一步对当天的日志按用户划分成多个文件。划分的依据是用户 id 取 hash,然后对分桶数量求余,每个分桶文件在 hdfs 上是一个独立的文件。

二、什么时候可以使用分桶表

分桶表最主要的使用场景是优化大表和大表的 join,其主要原理如下:
(1)如果大表和大表使用 MapReduce 的普通模式,会在 reduce 端 shuffle,那就非常可怕,一个是慢,另一个是容易出异常;
(2)而分桶表将大表的数据划分成一个个小块,分别在 Map 端做 join。
之所以可以这样,是因为分桶表在建表的时候,需要指定分桶的字段,对这个字段值取 hash 后对桶的个数取余数获得一个值,根据这个值将数据放到不同的桶里去。
相同 key 的数据都在一个桶里,在表和表关联的时候就不需要去扫描整个表,只需要去扫描对应桶里的数据即可。
(3)由于不同的数据落到哪个桶是由分桶个数决定的,所以做 Join 的两个分桶表的桶个数必须是相等或者成倍数;
(4)分桶表的每个桶必须要排序,这样可以更高效的做 map join。
这样的 join 称为 SMB map join (Sort Merge Bucket Map Join),核心思想是大表化成小表,分而治之。

三、建立分桶表

分桶表的语法如下:

create table user_order_bucket (id bigint,name string,order_date string,goods string,price double,cnt bigint
)
CLUSTERED BY (name) SORTED BY (name)INTO 5 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS orc;

和普通建表语句不同的是,使用下面的语句来指定分桶字段和分桶个数:
CLUSTERED BY (name ) INTO 5 BUCKETS

建好之后,需要执行一个 insert into 语句,执行一个 MapReduce 把原始表的数据划分到分桶表的不同桶中。
下面 user_order 是原始表,是 orc 格式,有 250w 数据,只有一个文件,30M。

insert overwrite table user_order_bucket select * from user_order;

执行之后,分桶表的 hdfs 如下:

可以看到每个分桶是一个文件,每个文件大概 5-6M

四、使用分桶表来优化 join

下面的开关需要打开以支持分桶表

set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

然后执行一个 join 的 SQL 来验证

select t1.name,t1.order_datefrom user_order_bucket t1 join user_order_bucket2 t2on t1.name = t2.name

首先是未开启以上三个参数的执行计划,这里不贴执行计划了,是正常的 MapReduce;
开启了以上三个参数后,发现是走的 Sorted Merge Bucket Map Join 了。

来执行一下看一下效果,把执行结果写入到另一个临时表中

insert overwrite table user_order_result
select t1.name,t1.order_datefrom user_order_bucket t1 join user_order_bucket2 t2on t1.name = t2.name;

由于本人的集群比较low,一共就 3G内存,6个 cpu
直接跑 MapReduce 的耗时为:
568,967,965 rows affected (590.048 seconds)

使用分桶表 map join 的耗时为:
568,967,965 rows affected (425.187 seconds)

效果不是特别显著,数据量越大,使用分桶表 map join 的效果越好。

Hive 分桶表原理及优化大表 join 实战相关推荐

  1. hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25

    1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...

  2. 大数据学习笔记42:Hive - 分桶表

    文章目录 一.Hive分桶表 1.分桶操作 2.分桶原理 3.注意事项 二.分桶表案例演示 1.创建数据文件courses.txt 2.将数据文件上传到HDFS的/bucket目录 3.基于/buck ...

  3. 全方位揭秘!大数据从0到1的完美落地之Hive分桶

    分桶的概述 为什么要分桶 数据分区可能导致有些分区数据过多,有些分区数据极少.分桶是将数据集分解为若干部分(数据文件)的另一种技术. 分区和分桶其实都是对数据更细粒度的管理.当单个分区或者表中的数据越 ...

  4. 内存只有100G,要全表扫描一个200G大表,会不会把内存用完?

    主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了? 所以大表全表扫描,看起来应该没问题. ...

  5. 大数据之hive:hive分桶表

    目录 一.回顾分区表 二.为什么分桶? 三.分桶表的使用 1.创建一个带分桶定义的表(分桶表) 2.加载数据: 3.对分桶表的查询 分桶总结: 实例 一.回顾分区表 为什么有分区? 随着系统运行时间增 ...

  6. hive分桶表join_Hive知识梳理

    以问题作为引导,进行Hive知识梳理,可以复习知识时,可以快速抓住要点 提交一条SQL到Hive后,Hive的执行流程是怎么样的? Sql的执行的一个示意图如下 sql 根据这个示意图,我们来描述一下 ...

  7. Hive分桶表插入数据报错“(The ownership on the staging directory /tmp/hadoop-yarn/staging/root/.staging is not”

    使用Hive在往分桶表插入数据是报错如下 Job Submission failed with exception 'java.io.IOException(The ownership on the ...

  8. Hive分桶表创建clustered by()

    创建分桶表 -- 1 创建分桶表 create table t_us_covid19_bucket(count_date string,county string,state string,fips ...

  9. Hive分桶(bucket)

    一 什么是桶的概念,和分区有啥区别? 对于每一个表或者分区,可以进一步细分成桶,桶是对数据进行更细粒度的划分.默认时对某一列进行hash,使用hashcode对 桶的个数求模取余,确定哪一条记录进入哪 ...

最新文章

  1. 字节跳动副总裁杨震原:A/B测试不是万能的,但不会一定不行
  2. java12章_【有书共读】java核心技术卷1--第12章
  3. Hadoop1.x之hdfs集群搭建
  4. mysql使用从c3p0_使用c3p0連接池操作mysql數據庫中文亂碼解決辦法
  5. 【tensorflow】【pytorch】_debug_错误集合
  6. java lt10_PAT 1006 换个格式输出整数 (15)(C++JAVAPython)
  7. [Python] MySQLdb(即 MySQL-python 包)在 OS X 中安装指南
  8. c语言实验5上机刘若慧2017年,《《 C语言程序设计案例教程》》.ppt
  9. 求首位相连一维数组最大子数组的和
  10. 推荐我们在B站免费的转录组课程|测序原理,GO/GSEA/WGCNA
  11. [Android] Bitmap OOM解决办法一
  12. array_sum的用法
  13. A Concise and Provably Informative Multi-Scale Signature Based on Heat Diffusion
  14. 牛客练习赛21:A. 黑妹的游戏I
  15. java程序员如何编写出优美的代码-java编程规范
  16. MSDN Library下载与安装(MFC)
  17. Unity3D 协程
  18. 计算机网络原理 笔记整理
  19. c++和java学哪个好,c++和java区别 学哪个比较好
  20. VMTools安装及使用

热门文章

  1. coding上传文件时显示找不到文件路径的问题
  2. 基于 TensorFlow 的逻辑回归详解
  3. 微服务架构的分布式事务解决方案(3)--常规MQ队列消息的处理流流程和特点(基于可靠消息的最终一致性)
  4. 股票和期货的108个区别(股票和期货的108个区别pdf)
  5. python数据导入mysql
  6. JS如何操作class选择器的样式
  7. Vue更改slot-scope=“scope“中的值
  8. 2016.11.9 小测试
  9. 【论文笔记】Digital Twin in Industry: State-of-the-Art——Tao Fei
  10. 微信开发坑哭了自己Code、OpenID、WXConfig、TOKEN、TICKET处处是坑