首页 > 其他分享 >Hive分区和分桶的区别

Hive分区和分桶的区别

时间:2023-02-08 22:33:35浏览次数:71  
标签:Comment 分桶 分区 指定 Hive 分区表

1.前言

Hive的分区和分桶都是细化数据管理,加快数据查询和分析,两者有什么区别呢?下面讲解一下分区和分桶的原理。

2.分区

(1)分区原理

Hive的分区表可以有一个或多个分区键,用于确定数据的存储方式。分区(除了作为存储单元)还允许用户有效地识别满足指定条件的数据,显著加快查询分析速度。分区字段并不是数据的一部分,而是加载时虚拟的列,数据在HDFS上存储时分区就相当于文件目录。

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值

Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。

(2)分区建表

分区表使用partitioned by 子句指定,以指定字段列,需要指定字段类型。

--分区表建表sql
USE testdb;
CREATE TABLE test_partition (
    field1 String Comment 'field1 comment',
    field2 String Comment 'field2 comment'
) Comment 'table comment' PARTITIONED BY(d String Comment 'date') STORED AS ORC; --分区表查询 SELECT * FROM testdb.test_partition WHERE d = '2022-02-01';

建表完成后查看LOCATION参数为:'
hdfs://ns/user/hive/warehouse/testdb.db/test_partition'。当存储数据时,2022-02-01日期的数存储在hdfs://ns/user/hive/warehouse/testdb.db/test_partition/d=2022-02-01目录下。

如果指定多个分区列用逗号分隔开,如:建表是PARTITIONED BY(d String Comment 'date',h String Comment 'hour'),分区字段日期常用格式:d=yyyy-MM-dd,h=HH。第二个参数会作为子目录存储在HDFS上:***/test_partition/d=2022-02-01/h=12

3.分桶

(1)分桶原理

分桶表是在表或者分区表的基础上,进一步对表进行组织,分桶表的数据可以根据表中某列的哈希函数的值依次划分为存储桶,用于分桶的字段是数据中实际的一列。其原理:根据分桶的列计算hash值,对hash值取模运算,将数据放到对应的桶里。保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。

如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

(2)分桶建表

分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数,桶编号从零开始。

--分桶表建表sql,创建4个桶
USE testdb;
CREATE TABLE test_bucket (
    field1 String Comment 'field1 comment',
    field2 String Comment 'field2 comment'
) COMMENT 'table comment' clustered by (field1) into 4 buckets row format delimited fields terminated by ','; --分桶表查询 SELECT * FROM testdb.test_bucket WHERE field1 = '0'

 

4.相同点和不同点

(1)相同点

分区和分桶表都是Hive细化数据管理,加快数据查询和分析。

(2)不同点

表现形式:

分区表是一个目录,分桶表是文件。

分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。

 

创建语句:

分区表使用partitioned by 子句指定,以指定字段为伪列,需要指定字段类型。

分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数。

 

数量:

分区表的分区个数可以增长,分桶表一旦指定,不能再增长。

 

作用:

分区避免全表扫描,根据分区列查询指定目录提高查询速度。

分桶保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)。

分桶表数据进行抽样和JOIN时可以提高MR程序效率。

 

标签:Comment,分桶,分区,指定,Hive,分区表
From: https://www.cnblogs.com/yeyuzhuanjia/p/17103585.html

相关文章