hive大表和小表MapJoin关联查询优化

大表和小表关联查询可以采用mapjoin优化查询速度。
那什么是mapjoin呢?
理解MapJoin之前先介绍另一种Join方式,CommonJoin。
我们知道Hive编写SQL语句,Hive会将SQL解析成MapReduce任务。
对于一个简单的关联查询,CommonJoin任务设计Map阶段和Reduce阶段。
Mapper 从连接表中读取数据并将连接的 key 和连接的 value 键值对输出到中间文件中。Hadoop 在所谓的 shuffle 阶段对这些键值对进行排序和合并。Reducer 将排序结果作为输入,并进行实Join。Shuffle 阶段代价非常昂贵,因为它需要排序和合并。
因此减少 Shuffle 和 Reduce 阶段的代价可以提高任务性能。
MapJoin 的目的是减少 Shuffle和 educer阶段的代价,并仅在 Map 阶段进行Join。

MapJoin的工作机制如图:

1)Task A,它是一个Local Task(在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到分布式缓存DistributeCache中。
2)Task B,该任务是一个没有Reduce的MR,启动MapReduce扫描大表。在Map阶段,根据a的每一条记录去和DistributeCache中的b对应的HashTable关联,并直接输出结果。
3)由于MapJoin没有Reduce,所以Map直接输出结果文件,有多少MapTask,就有多少个结果文件。

在命令行开启MapJoin功能:
set hive.auto.convert.join=true;
Hivev0.7之前,需要使用hint提示/*+mapjoin(table)*/才会执行MapJoin。
0.7之后默认值为true,默认开启MapJoin。
Hive能自动判断哪个表是小表,那么多小的表才是小表呢?
由参数hive.mapjoin.smalltable.filesize=25000000决定,默认是25M。

因此小表在jion的前面和后面,效果都是一样的,因为Hive自动判断谁是小表,将其加载到内存。
select b.* from bigtable b join smalltable s on s.id = b.id;
select b.* from smalltable s join bigtable b on s.id = b.id;

原文地址:https://www.cnblogs.com/lucas-zhao/p/12025000.html

时间: 2024-10-07 10:27:45

hive大表和小表MapJoin关联查询优化的相关文章

hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from  wizad_mdm_dev_lmj_20141120 as w JOIN wizad_mdm_main as a ON (a.rowkey = w.guid); 程序启动后,死循环,无反应.最后在进行到0.83时,内存溢出失败. 原因: 默认情况下,Hive会自动将小表加到DistributeCa

【Spark调优】小表join大表数据倾斜解决方案

[使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案.. [解决方案] 小表join大表转为小表broadcast+map大表实现.具体为: 普通的join是会shuffle的,而一旦shuffle,就相当于会将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join,此时如果发生数据倾斜,影响处理性能,而此时恰好

Mysql Join大表小表到底谁驱动谁

1.准备 mysql> create table dept( id int unsigned auto_increment not null primary key, name varchar(20) default '' not null, key(name) )engine=innodb default charset=utf8mb4; CREATE TABLE `userinfo` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255

hive join 优化 --小表join大表

1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高,hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配,从而省去reduce. 例子: select /*+MAPJOIN(b)*/ a.a1,a.a2,b.b2 from tablea a JOIN tableb b ON a.a1=b.b1 在0.7版本后,也可以用配置来自动优化 set hive.auto.convert.join=true;

查询优化--小表驱动大表(In,Exists区别)

Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批量插入数据)  文章中的第 1-7 步,注意,不要执行第8步 1.2 插入数据 现在来执行第8步. 1.2.1 向 Department 表中插入 100 条记录 CALL insert_dept(1000, 100) 1.2.2 向 Employee 表中插入 100000 条记录 CALL in

Mysql优化原则_小表驱动大表IN和EXISTS的合理利用

//假设一个for循环for($i = 0; $i < 10000; $i++) { for ($j = 0; $i < 50; $j++) { }} for($i = 0; $i < 50; $i++) { for ($j = 0; $i < 10000; $j++) { }} 看以上两个for循环,总共循环的次数是一样的.但是对于mysql数据库而言,并不是这样了,我们尽量选择第②个for循环,也就是小表驱动大表.数据库最伤神的就是跟程序链接释放,第一个建立了10000次链接,

hive表信息查询:查看表结构、表操作等--转

原文地址:http://www.aboutyun.com/forum.PHP?mod=viewthread&tid=8590&highlight=Hive 问题导读:1.如何查看hive表结构?2.如何查看表结构信息?3.如何查看分区信息?4.哪个命令可以模糊搜索表? 1.hive模糊搜索表  show tables like '*name*'; 2.查看表结构信息  desc formatted table_name;  desc table_name; 3.查看分区信息  show p

hive表信息查询:查看表结构、表操作等

转自网友的,主要是自己备份下 有时候不记得! 问题导读:1.如何查看hive表结构?2.如何查看表结构信息?3.如何查看分区信息?4.哪个命令可以模糊搜索表 1.hive模糊搜索表 show tables like '*name*'; 2.查看表结构信息  desc formatted table_name;  desc table_name; 3.查看分区信息  show partitions table_name; 4.根据分区查询数据  select table_coulm from ta

hive表与外部表的区别

相信很多用户都用过关系型数据库,我们可以在关系型数据库里面创建表(create table),这里要讨论的表和关系型数据库中的表在概念上很类似.我们可以用下面的语句在Hive里面创建一个表: hive> create table wyp(id int, > name string, > age int, > tele string) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '\t' > STORED AS TEX