## Hive分区、桶、与倾斜

版权声明:打个招呼,转载呗! https://blog.csdn.net/weixin_41919236/article/details/84289332

Hive的分区

(1)在Hive Select 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候查询 只需要扫描表中关心的一部分数据,因此建表时引入partition概念。

(2)分区表指的是在创建表时指定的partition的分区空间。

(3)如果需要创建有分区的表,需要在create表的时候调用可选参数partition by ,详细见表创建的语法结构。

(4) 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存储在表文件夹的目录下。

(5)表和列名不区分大小写。
(6) 分区是以字段的形式在表结构中存在的,通过dsscribe table 命令可以查看到字段存在,但是该字段 不存放实际的数据内容,仅仅是分区的表示

Hive的桶表

分桶其实就是把大表化成了‘小表’,然后通过两个表相同列使用Map端连接(Map-Side Join),这就是用来解决大表与小表之间的连接问题。将桶中的数据按某列进行排序会提高查询效率。

(1)创建分桶表

CREATE TABLE tb_bucket_shop (
shop_id int,
shop_name string,
shopkeeper string,
) CLUSTERED BY (shop_id) INTO 4BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

(2)数据导入

set hvie.enforce.bucketing=true; INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb part shop CLUSTER BY shop id;

若没有使用hive. enforce.bucketing属性,则需要设置和分桶个数相匹配的reducer个数,同时SELECT后添加CLUSTER BY

set mapred.mapred.reduce.tasks=4;
INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name,
shopkeeper FROM tb part shop CLUSTER BY shop id;

分桶适合于sampling(采样),不过其数据正确地导入到hive表中,需要用户自己来证明,因为table中信息仅仅是元数据,而不影响实际填充表的命令。

(3)小结

分区分桶是hive性能优化的一个手段,不同的字段,其数值属性不同,其对应的有优化当时也不同,不能简单地认为分区分桶对应传统关系型数据库的分库分表,两者完全不一样。

Hive数据倾斜

(1)数据倾斜的原因

使map的输出数据更均匀的分布到Reduce中,是我们的最终目标。由于Hash算法的局限性,按key Hash会或多或少地造成数据倾斜。大量经验表明数据倾斜的原因是人为的建表疏忽或业务逻辑,是可以规避的。

(2)解决思路

Hive的执行是分段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀地分配到各个reduce中,就是解决数据倾斜的根本原因所在。

(3)具体办法

  • 内存优化和I/O优化。

  • 驱动表:使用大表做驱动表,以防止内存溢出;Join最右边的表是驱动表;Mapjoin无视join顺序,用大表做驱动表。

Mapjoin是一种避免数据倾斜的手段

允许在map阶段进行join操作,MapJoin把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。由于对map进行了join操作,省去了reduce运行,效率也会高很多。

在对多个表join连接操作时,将小表放在join的左边,大表放在join的右边。在执行这样的join连接时,小表中的数据会被缓存到内存当中,这样可以有效减少发生内存溢出错误的几率。

(1)设置参数

hive.map.aggr=true
hive.groupby.skewindata=true

还有其他参数,请小伙伴自行官网看相关文档。

(2)SQL语言调节

比如:在group by 维度过小时,采用sum() group by 的方式 来替换count(distinct)完成计算。

(3)StreamTable

将在reduce中进行join操作时的小table放入内存,而大table通过stream方式读取。

(4)索引

Hive从0.80开始才有索引,它提供了一个Bitmap位图索引,索引可以加快group by查询语句的执行速度,但是用的比较少。

猜你喜欢

转载自blog.csdn.net/weixin_41919236/article/details/84289332