Hive优化

本文详细介绍了Hive的优化策略,包括建立表分区以提高查询效率,Join优化如Map Join和Sort Merge Bucket Map Join,Group By优化减少数据处理时间,数据存储优化建议使用ORC格式,SQL语句优化技巧,以及启用CBO以选择最优查询计划。此外,还讨论了数据倾斜问题的解决方案。
摘要由CSDN通过智能技术生成

Hive优化可以通过以下来进行考虑

1、建立表分区

使用场景

Hive在做Select查询时,一般会扫描整个表内容,会消耗较多时间去扫描不关注的数据。此时,可根据业务需求及其查询维度,建立合理的表分区,从而提高查询效率。

指定静态分区或者动态分区

  • 静态分区:

静态分区是手动输入分区名称,在创建表时使用关键字PARTITIONED BY指定分区列名及数据类型。应用开发时,使用ALTER TABLE ADD PARTITION语句增加分区,以及使用LOAD DATA INTO PARTITON语句将数据加载到分区时,只能静态分区。

  • 动态分区:通过查询命令,将结果插入到某个表的分区时,可以使用动态分区。

动态分区通过在客户端工具执行如下命令来开启:

set hive.exec.dynamic.partition=true

动态分区默认模式是strict,也就是必须至少指定一列为静态分区,在静态分区下建立动态子分区,可以通过如下设置来开启完全的动态分区:

set hive.exec.dynamic.partition.mode=nonstrict

说明:

  1. 动态分区可能导致一个DML语句创建大量的分区,对应的创建大量新文件夹,对系统性能可能带来影响。
  2. 在文件数量大的情况下,执行一个SQL语句启动时间较长,可以在执行SQL语句之前执行“set mapreduce.input.fileinputformat.list-status.num-threads = 100;”语句来缩短启动时间。“mapreduce.input.fileinputformat.list-status.num-threads”参数需要先添加到Hive的白名单才可设置。     

2 Join优化

使用Join语句时,如果数据量大,可能造成命令执行速度和查询速度慢,此时可进行Join优化。

Join优化可分为以下方式:

  • Map Join
  • Sort Merge Bucket Map Join

Join顺序优化

 

Map Join

Hive的Map Join适用于能够在内存中存放下的小表(指表大小小于25MB),通过“hive.mapjoin.smalltable.filesize”定义小表的大小,默认为25MB。

Map Join的方法有两种:

  • 使用/*+ MAPJOIN(join_table) */。
  • 执行语句前设置如下参数,当前版本中该值默认为true。
set hive.auto.convert.join=true

使用Map Join时没有Reduce任务,而是在Map任务前起了一个MapReduce Local Task,这个Task通过TableScan读取小表内容到本机,在本机以HashTable的形式保存并写入硬盘上传到DFS,并在distributed cache中保存,在Map Task中从本地磁盘或者distributed cache中读取小表内容直接与大表join得到结果并输出。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值