[Hive]Hive中表连接的优化,加快查询速度

2024-04-16 09:08

本文主要是介绍[Hive]Hive中表连接的优化,加快查询速度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、多表连接的执行顺序和MapReduce job优化

selecta.ymd,a.price_close,b.price_close,c.price_close
from stocks a join stocks b on a.ymd = b.ymdjoin stocks c on a.ymd = c.ymd
where a.symbol = 'APPL' and b.symbol = 'IBM' and c.symbol = 'GE'

 

大多数情况下Hive会对每对 JOIN 连接对象启动一个MapReduce任务。上例中会首先启动一个MapReduce job对表 a 和表 b 进行连接操作,
然后会启动一个MapReuce job将第一个MapReduce job的输出和表 c 进行连接操作。

当对3个或者更多个表进行 JOIN 连接时,如果每个 ON 子句都使用相同的连接键的话,那么只会产生一个 Map Reduce job。
即Hive通过一个优化可以在同一个Map Reduce job 中连接多个表(需要每个子句中有相同的连接键)。

2、JOIN连接时表的顺序(内连接)
Hive假定查询中最后一个表是最大的那个表,在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。
因此用户需要保证连续查询中表的大小从左往右是依次增加的。

用户也可以人为显示告诉查询优化器哪张表是大表,即使它在查询中不是位于最后面的,使用方式如下:

select /*+STREAMTABLE(s)*/s.ymd, s.symbol,s.price_close,d.dividend
from stocks s JOIN dividends d ON s.ymd = d.ymd and s.symbol = d.symbol
where s.symbol='APPL'

3、连接前通过WHERE过滤数据加快查询数据
最直接了当的方式是使用嵌套SELECT语句:

select s.ymd,s.symbol,s.price_close,d.dividends 
from (select * from stocks where symbol = 'AAPL' and exchange = 'NASDAQ')s
left outer join(select * from dividends where symbol = 'AAPL' and exchange = 'NASDAQ')d
on s.ymd = d.ymd

4、map-side JOIN 优化含有小表的连接
如果所有表中只有一张表是小表,则可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行连接过程(称为mao-side JOIN),这是因为
Hive可以和内存中的小表逐一匹配,从而省略常规连接操作需要的reduce过程。不仅减少了reduce过程,有时也可以同时减少map过程的执行步骤。

set hive.auto.convert.join=true; --让Hive在必要的时候启动优化
hive.mapjoin.smalltable.filesize=25000000; --设置能够使用这个优化的小表的大小(单位是字节)

 

这篇关于[Hive]Hive中表连接的优化,加快查询速度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/908366

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优