Hive分区(Partition)和桶(Bucket)

Hive分区通过按规则创建分区目录,提高查询效率,静态分区需手动添加,动态分区在插入数据时指定。桶进一步细化数据划分,通过字段hash进行桶内数据分布,提高抽样查询性能。文章介绍了分区表创建、插入数据、查询和删除分区,以及桶的使用方法和对查询性能的影响。

介绍

HIve做为数据仓库,往往会存储大量数据。当数据量过大时,会大大降低查询和统计效率。为了解决这个问题提出了分区(Partition)概念,将数据按照一定的规则进行分区,这样需要读取数据时,就可以直接扫面某个分区下的数据,避免全表扫描,提高了查询统计效率。例如按照地区(省份)进行分区,北京地区数据会落到一个分区目录中,天津地区数据落到另一个分区目录中,当要查询北京/天津地区数据时,直接扫描北京/天津分区目录,大大缩短了查询时间。

分区表创建

分区表创建方式有两种,静态分区和动态分区。二者区别在于是否手动创建分区,静态分区需要在插入数据前使用add partition命令添加分区,动态分区只需要在插入数据insert命令中指定分区字段即可。因此在存在大量分区时使用动态分区比较方便,不需要手动创建这些分区。

create table test(id int, name string) partitioned by (year int);

注意:分区表创建时分区字段不需要单独做为column指定,只需要在partitioned by()中指定字段和类型即可,多个分区字段用“,”隔开

插入数据

数据插入成功后,会在warehouse(HDFS)上创建对应分区目录,例如/hive/warehouse/test/year=2020,/hive/warehouse/test/year=2019等分区目录。

静态分区

先手动添加分区

alter table test add partition(year=2020);

然后插入数据


                
### 原理 - **分区原理**:Hive数据表根据某些字段进行分区操作,本质是将数据按照分区字段的值进行划分,在HDFS上以子目录的形式存储不同分区的数据。当进行查询时,可根据分区字段的值直接定位到相应分区的文件,从而减少需要处理的数据量,提高查询速度。例如,若按日期对表进行分区,查询某一天的数据时,只需访问该日期对应的分区目录下的文件即可[^1]。 - **分原理**:分是相对分区更细粒度的划分,将整个数据内容按照某列属性值的hash值进行区分。例如,要按照name属性分为3个,就是对name属性值的hash值对3取模,按照取模结果对数据分,取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。分可以减少shuffle花费的时间,避免将表文件分化成过于细化的文件,防止单个小数据文件浪费HDFS存储空间启动冗余的mapper进程,导致资源浪费[^1][^3]。 ### 使用方法 - **分区使用方法**:在创建表时,使用`partitioned by`关键字指定分区字段。示例代码如下: ```sql CREATE TABLE partitioned_table ( column1 datatype, column2 datatype ) PARTITIONED BY (partition_column datatype); ``` 向分区表中加载数据时,需要指定分区的值,示例代码如下: ```sql LOAD DATA INPATH 'hdfs://path/to/data' INTO TABLE partitioned_table PARTITION (partition_column = 'value'); ``` - **分使用方法**:创建表时,使用`clustered by`关键字指定分字段,并使用`into`关键字指定分数。示例代码如下: ```sql CREATE TABLE bucketed_table ( column1 datatype, column2 datatype ) CLUSTERED BY (bucket_column) INTO 4 BUCKETS; ``` 开启分功能,可使用如下语句: ```sql SET hive.enforce.bucketing=true; ``` 设置为`true`之后,MR运行时会根据bucket的个数自动分配reduce task个数。 ### 区别 - **划分方式**:分区只能按字段的value分区,而分则可以按照字段的value的HashPartitioner分区[^1]。 - **创建语句**:分区使用`partitioned by`指定分区字段,分使用`clustered by`指定分字段并使用`into`指定分数。且分区字段不能使用原表中的字段,分字段必须使用原表中的字段[^4]。 - **作用侧重点**:分区简化的本质是减少MR的作业量,相应的shuffle也会减少;而分本质是减少shuffle花费的时间[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值