09-hive中的分区表

本文详细介绍了Hive分区表的概念、作用和使用方法,包括一级、二级和三级分区的创建与加载数据。分区有助于提高查询效率,通过指定分区进行数据筛选,避免全表扫描。在创建动态分区时需谨慎,避免过多分区导致性能问题。Hive分区与MySQL分区的主要区别在于分区字段的位置,Hive使用表外字段。最后,文章提醒在使用分区时应注意分区字段的选择和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive中的分区表

为什么分区

Hive的Select查询时,一般会扫描整个表内容。随着系统运行的时间越来越长,
表的数据量越来越大,而hive查询做全表扫描,会消耗很多时间,降低效率。
而有时候,我们需求的数据只需要扫描表中的一部分数据即可。
这样,hive在建表时引入了partition概念。即在建表时,
将整个表存储在不同的子目录中,每一个子目录对应一个分区。
在查询时,我们就可以指定分区查询,避免了hive做全表扫描,从而提高查询效率。

如何分区

根据业务需求而定,不过通常以年、月、日、小时、地区等进行分区。

分区的语法

create table tableName(
......
......
)
partitioned by (colName colType[comment '...'],...)

分区的注意事项

- hive的分区名不区分大小写。不支持中文
- hive的分区字段是一个伪字段,但是可以用来进行操料
- 一张表可以有一个或者多个分区,并且分区下面也可以有一个或者多个分区。
- 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

分区的意义

让用户在做数据统计的时候缩小数据扫描的范围。在进行select操作时可以指定要统计哪个分区

分区的本质

在表的目录或者是分区的目录下在创建口剥分区的目录名为指定字段=值

分区的使用

一级分区的使用

1 ) 建表语句

create table if not exists part1(
id int,
name string,
age int
)
partitioned by (dt string)
row format delimited
fields terminated by '\t'
lines terminated by '\n';

2 ) 加载数据

user1.txt (user2.txt)

1 user1  1
2 user2  2
3 user1  1
4 user2  2
5 user2  2
6 user1  1
7 user2  1
8 user1  2
9 user2  2
load data local inpath './root/user1.txt' into table part1 partition(dt='2020-05-05');

select * from part1;
1 user1  1  2020-05-05
2 user2  2  2020-05-05
3 user1  1  2020-05-05
4 user2  2  2020-05-05
5 user2  2  2020-05-05
6 user1  1  2020-05-05
7 user2  1  2020-05-05
8 user1  2  2020-05-05
9 user2  2  2020-05-05

load data local inpath './root/user2.txt' into table part1 partition(dt='2020-05-06');

# 这样就会从2020-05-05里查
select * from part1 where dt='2020-05-05';

二级分区的使用

1 ) 建表语句

create table if not exists part2(
id int,
name string,
age int
)
partitioned by (year string,month string)
row format delimited
fields terminated by '\t';

2 ) 加载数据

load data local inpath './root/user1.txt' into table part1 partition(year='2020',month='03');
load data local inpath './root/user1.txt' into table part1 partition(year='2020',month='04');
load data local inpath './root/user1.txt' into table part1 partition(year='2020',month='05');

select * from part2 where year='2020' and month='04';
三级分区的使用

1 ) 建表语句

create table if not exists part2(
id int,
name string,
age int
)
partitioned by (year string,month string,day string)
row format delimited
fields terminated by '\t';

2 ) 加载数据

load data local inpath './root/user1.txt' into table part1 partition(year='2020',month='03',day='01');
load data local inpath './root/user1.txt' into table part1 partition(year='2020',month='04',day='02');
load data local inpath './root/user1.txt' into table part1 partition(year='2020',month='05',day='03');

select * from part2 where year='2020'and month='04'and day='02';

在hive中,分区字段名是不区分大小写的,不过字段值是区分大小写的。

查看分区
show partitions tableName;
# 举例
show partitions part1
删除分区
alter table part2 drop partition(year='2020',month='05',day='03');

-- 删除多个分区 逗号隔开
alter table part2 drop 
partition(year='2020',month='05',day='03'),
partition year='2020',month='04',day='02';

结论︰在删除操作时,对应的目录(最里层)会被删除,上级目录如果没有文件存在,也会被删除,如果有文件存在,则不会被删除。

在这里插入图片描述

hive分区类型详解

在这里插入图片描述

创建动态分区的案例

1 )创建动态分区表

create table if not exists dy_part1(
id int,
name string,
gender string,
age int,
academy string
)
partitioned by (dt string)
row format delimited fields terminated by '\t'
;

2 )动态分区加载数据

下面方式不要用,因为不是动态加载数据
load data local inpath './root/user1.txt' into table dy_part1 partition(dt='2020-05-06');

正确方式,要从别的表中加载数据

第一步:先创建临时表

create table if not exists temp_part1(
id int,
name string,
gender string,
age int,
academy string
)
partitioned by (dt string)
row format delimited fields terminated by '\t'
;
注意

创建临时表时,必须要有动态分区表中的分区字段

第二步:导入数据到临时表

在这里插入图片描述

第三步:动态加载到表

insert into dy_part1 partition(dt) select sid name,gender,age,academy,dt from temp_part1;

注意:严格模式下,给动态分区表导入数据时,分区字段至少要有一个分区字段是静态值
	非严格模式下,导入数据时,可以不指定静态值。
混合分区示例

在这里插入图片描述

在这里插入图片描述

分区表注意事项
1. hive的分区使用的是表外字段,分区字段是一个伪列,但是分区字段是可以做查询过滤。
2.分区字段不建议使用中文
3.一般不建议使用动态分区,因为动态分区会使用mapreduce来进行查询数据,如果分区数据过多,导致namenode和resourcemancger的性能瓶颈。所以建议在使用动态分区前尽可能预知分区数量。
4.分区属性的修改都可以修改元数据和hdfs数据内容。

Hive分区和Miysql分区的区别

mysql分区字段用的是表内字段;而hive分区字段采用表外字段。

### Hive内部分区表的概念及其实现 #### 分区表的核心概念 Hive中的分区表是一种用于优化大数据询的技术。它通过将数据按照某个或某些列的值划分为不同的子集,从而使得询操作更加高效[^2]。这种技术允许用户仅加载特定条件下的数据,而不是扫描整个表格的内容。 #### 动态分区功能 为了支持更灵活的数据插入方式,Hive引入了动态分区的功能。启用此功能需要设置参数`hive.exec.dynamic.partition=true`[^1]。这样,在向分区表中插入数据时,Hive可以根据实际数据内容自动生成对应的分区路径并保存数据[^3]。 #### 创建分区表的具体方法 以下是创建一个基于日期字段(`day`)进行分区的表的例子: ```sql CREATE TABLE dept_partition ( deptno INT, -- 部门编号 dname STRING, -- 部门名称 loc STRING -- 部门位置 ) PARTITIONED BY (day STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` 上述SQL语句定义了一个名为`dept_partition`的表,并指定了按字符串类型的`day`字段进行分区[^4]。 #### 向分区表写入数据的方式 对于已经创建好的分区表,可以通过多种方式进行数据填充。其中一种常见的方式是使用`LOAD DATA`命令直接导入文件到指定的分区目录下;另一种则是利用`INSERT INTO ... PARTITION (...) SELECT ... FROM ...`结构完成复杂场景下的数据迁移工作。 #### 使用分区表的优势分析 采用分区策略不仅有助于加快询速度,还便于日常维护以及实施长期存档计划等方面的工作。当面对海量记录集合时,合理设计分区方案往往能带来显著效益改进效果[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值