前言:
此刻看官们对“hive oracle”大体比较注重,小伙伴们都想要剖析一些“hive oracle”的相关内容。那么小编同时在网上收集了一些有关“hive oracle””的相关资讯,希望你们能喜欢,你们一起来了解一下吧!分区表结构设计
例如下图SQL查询时,会扫描全表,假如全表有几十G数据,查询会很慢。
通过打印SQL执行计划可以看到,该语句执行是直接到表去扫描的。这是因为Hive会使用表的最后一级目录作为底层处理数据的输入进行扫描
分区表结构设计思路:依据查询的需求,将数据按照查询的条件【一般以时间】进行划分分区存储,将不同分区的数据单独使用一个HDFS目录进行存储,当底层实现计算时,依据查询的条件,只读取对应分区的数据作为输入,减少不必要的数据加载,提高程序的性能。
分桶表结构设计
思路:2个表的数据量很大,将join关联字段按相同的规则划分后再进行Join。
例子:
执行计划可以看到,没有分桶前查询时全表扫描的。
构建分桶表
分桶Join执行计划
可以看到是桶之间Join
索引设计优化
在索引中MySQL,Oracle与Hive唯一的区别是Hive不支持主键或者外键的索引
由于太慢,要运行MapReduce程序执行,每次还要更新索引和变移量。Hive3.0已经不支持这种索引了。
文件格式优化
Hive的默认文件格式是TextFile。通过stored as file_format更改文件格式压缩文件大小。
格式1:SequenceFile
格式2:Partquet
格式3:ORC
数据压缩
实例,指定压缩格式,选用压缩算法,如下:
存储优化--合并小文件
1、判断小文件,
2、合并小文件
第一
第二
第三,只适合ORC
Hive优化器
谓词下推(PDD)
推荐形式1:先过滤再join
数据倾斜--Group by 、Count(distinct)产生
优化方案1:开启Map端聚合
hive.map.aggr=true
通过减少suffle数量和Reducer阶段的执行时间,避免每个Task数据差异过大导致数据倾斜
优化方案2:实现随机分区
select * from table distribute by rand()
distribute by 用于指定底层按照哪个字段作为Key实现分区、分组等,通过rand函数随机实现分区,避免数据倾斜。
优化方案3:数据倾斜时自动负载均衡
hive.groupby.skewindata=ture
开启该参数以后,当前程序会自动通过两个MapReduce来运行
第一个MapReduce自动进行随机分布到Reducer中,每个Reducer做部分聚合操作,输出结果。第二个MapReduce将上一步聚合的结果再按照业务(group by key )进行处理,保证相同的分布到一起,最终聚合得到结果。
数据倾斜--Join产生
优化方案1:提前过滤,将大数据变成小数据,实现Map Join
优化方案2:使用Bucket Join
如果使用方案1过滤后数据依然是一张大表,那么最后的Join依旧是一个Reduce Join ,这种情况下,可以将2张表的数据构建为桶表,实现Bucket Map Join,避免数据倾斜。
优化方案3:使用Skew Join
Skew Join是Hive中一种专门为了避免数据倾斜而设计的特殊的Join过程。原理是将Map Join和Reduce Join进行合并,如果某个值出现了数据倾斜,就会产生数据倾斜的数据单独使用Map Join来实现。其他没有产生数据倾斜的数据由Reduce Join的结果进行Union合并。
配置
标签: #hive oracle