大象教程
首页
Spark
Hadoop
HDFS
MapReduce
Hive
Hive 教程
Hive 教程
Hive 安装(基于Ubuntu系统)
Hive 架构
Hive 内置函数
Hive UDF 简介
Hive DDL 命令
Hive 视图
Hive 索引
Hive Metastore 的三种配置方式
Hive 数据模型
Hive 数据类型
Hive 操作符
Hive SerDe(序列化与反序列化)
Hive 数据分区
Hive 分桶
Hive 分区与分桶的比较
Hive Join 的原理与机制
Hive map Join
Hive bucket map join
#Hive bucket map join 在 Hive 中,当表非常大,而且所有需要关联的表都是分桶表,并且关联字段都是分桶字段,那么我们就可以使用 bucket map join 来关联表。另外需要注意的是,一个表的分桶数是另一个表的分桶数的倍数。 ![hive bucket map join](/media/editor/file_1574953386000_20191128230308077253.png "hive bucket map join") 用例子来理解一下什么是 bucket map join。如果一个表的分桶数是 2 ,那么其他表的分桶数必须是 2 或者是 2 的倍数(2,4,6等等)。因此如果满足了前面这些条件,那么表的 join 操作就只会在 mapper 端进行。否则,表的 join 就是一个普通的 inner join。 在每个 mapper 中,所有表的分桶中只有匹配的分桶会被复制到 mapper 内存中。因此,bucket map join 的执行效率是非常高的。注意在 bucket map join 中,确保数据没有排序。 另外需要注意的,**默认情况下,Hive 不支持 bucket map join**。所以我们需要把下面的属性设置为 true: ```hive set hive.optimize.bucketmapjoin = true ``` ##bucket map join 原理 多个表使用 bucket map join 来关联的时候,关联操作只会在 mapper 端进行。换一种方式来理解就是,mapper 处理 A 表的分桶1的时候,它只会从 B 表的分桶 1 取数据。即分桶之间做关联。 ##bucket map join 使用场景 bucket map join 适用于以下场景: - 所有的表都非常大 - 关联字段使用的是表的分桶字段 - 一个表的分桶数是另一个表的分桶数的倍数 - 所有的表都是不排序的 ##bucket map join 缺点 使用 bucket map join 主要的缺点就是必须要根据 SQL 代码的特点来对表做分桶,也就是说,SQL 中的关联字段和表的分桶字段要一致才行。只要关联字段和分桶字段不一致,我们就没办法使用 bucket map join 了。 ##使用 bucket map join 相关技巧 首先,表的分桶字段与关联字段要保持一致。另外,在插入数据的时候要对表做分桶,其中有一种方式就是在插入数据之前把 `hive.enforce.bucketing` 参数设置为 `true`。 ```hive set hive.enforce.bucketing=true ``` 比如: ```sql create table b1( col0 string, col1 string, col2 string, col3 string, col4 string, col5 string, col6 string ) clustered by (col0) into 32 buckets; create table b2( col0 string, col1 string, col2 string, col3 string, col4 string, col5 string, col6 string ) clustered by (col0) into 8 buckets; set hive.enforce.bucketing = true; insert OVERWRITE table b1 select * limit 10000; insert OVERWRITE table b2 select * limit 10000; ``` 在做关联的时候把下面参数设置为 `true` ```sql set hive.optimize.bucketmapjoin=true; ``` 关联代码: ```sql select /*+ MAPJOIN(b2) */ b1.* from b1,b2 where b1.col0=b2.col0; ```
加我微信交流吧