IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive的多种JOIN优化 -> 正文阅读

[大数据]Hive的多种JOIN优化

案例一:

select
	a.id,a.number,b.number,c.number
from table_tmp a 
join table_tmp b on a.id = b.id 
join table_tmp c on a.id = c.id
where a.business = 'A'
and b.business = 'B'
and c.business = 'C'

如上例中,Hive会对每对join连接对象启动一个MaoReduce任务。首先启动一个MapReduce job对表a和表b进行连接操作,然后再启动一个MapReduce job将第一个MapReudce job的输出和表c进行连接操作。

这里可能有的同学就提出疑问了?为什么不是表b和表c先进行连接操作呢?

因为Hive总是按照从左到右的顺序执行的。

补充:前边的例子中,每个on子句都用到了a.id作为其中一个join连接键。这种情况下,Hive中有个优化:当对3个表或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。

案例二(JOIN优化):

select
	a.id,a.number,b.number
from big_table_tmp a 
join small_table_tmp b on a.id = b.id 

表a为大表,表b为小表,我们错误的将小表,放在了后边。

优化:

应该交换下表a和表b的位置,如下:

select
	a.id,a.number,b.number
from small_table_tmp a 
join big_table_tmp b on a.id = b.id 

这样在查询中最后一个表为最大的那个表,在对每行记录进行操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。因此,我们在编写SQL时需保证查询中表的大小从左到右是依次增加的。同时Hive也提供了一个“标记”机制来显式的告知查询优化器哪张表是大表,使用如下:

select /* STREAMTABLE(a)*/
	a.id,a.number,b.number
from big_table_tmp a 
join small_table_tmp b on a.id = b.id 

这里,Hive通过标记,会将表a 作为驱动表,即使其在查询中不是位于最后面的。

案例三(map-side JOIN):?

?如果所有表中只有一张表是小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行连接的过程我们称之为map-side JOIN。这是因为Hive可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程。即使对于很小的数据集,这个优化也明显地要快于常规的连接操作,这样不仅减少了reduce过程,而且有时还可以同时减少map过程的执行步骤。

select /* +MAPJOIN(b)*/
	a.id,a.number,b.number
from big_table_tmp a 
join small_table_tmp b on a.id = b.id 

注意:从Hive v0.7开始,废弃了这种标记的方式,不过如果增加这个标记也是有效的。如果不增加这个标记,用户需要设置属性 hive.auto.convert.join=true,这样Hive才会在必要的时候启动这个优化,默认情况下为false。

set hive.auto.convert.join=true;
select
	a.id,a.number,b.number
from big_table_tmp a 
join small_table_tmp b on a.id = b.id 

?同时需要注意的是,用户也可以配置能够使用这个优化的小表的大小,默认值如下:

hive.mapjoin.smalltable.filesize=25000000

如果用户期望Hive在必要的时候自动启动这个优化的话,也可以将这个(或其他优化配置)设置在${HIVE_HOME}/bin目录下有个.hiverc文件中。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:57:41  更:2022-03-21 20:58:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:05:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码