文章目录
- 分区目的
- 分区的创建
- 1.创建建表时候不管动态还是静态分区
- 2.执行load 装载数据
- 3.查看表结构,查询分区表的数据
- 4.静态分区:
- 5.动态分区:
- 多分区
- 表分区的增删改查
分区目的
-分区主要用于提高性能
-分区列的值将表划分为一个个的文件夹
-查询时语法使用"分区"列和常规列类似
-查询时Hive会只从指定分区查询数据,提高查询效率
-分为静态分区和动态分区
分区的创建
Hive创建分区时,是通过partitioned by关键字进行创建,要注意的是这个关键字定义的列是表中正式的列,不能与表中其他列名重复,他们是目录(分区)名,目录下放的才是数据。分区字段不能与表中其他字段重复,否则会报错
1.创建建表时候不管动态还是静态分区
create table userinfos(
userid string,
age string,
birthday string)
partitioned by (sex string)
row format delimited fields terminated by ','
stored as textfile;
2.执行load 装载数据
(其实load操作相当于把文件移动到HDFS的Hive目录下)
这种方式不合理直接忽略了性别,在查的时候强行改变该列的值但是原数据没有改变
load data local inpath '/opt/datas/user.csv' overwrite into table userinfos partition (sex='male');
3.查看表结构,查询分区表的数据
desc userinfos;
select * from userinfos;
4.静态分区:
指定分区就忽略该字段强行为分区值
场景:增量表
create table ods_users(
userid string,
username string,
birthday string,
sex string
)
row format delimited fields terminated by ','
location '/pw';
插入数据
insert into userinfos partition(sex='male') select userid,username,birthday from ods_users where sex='male';
insert into userinfos partition(sex='female') select userid,username,birthday from ods_users where sex='female';
5.动态分区:
如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
场景:数据量较小,全量导入
步骤
create table myusers(
userid string,
username string,
birthday string
)
partitioned by (sex string)
row format delimited fields terminated by ','
stored as textfile;
1.开启动态(因为默认就是静态)
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
2.插入数据(不指定分区值,该字段相同值就会分为一个分区)
insert into myusers partition(sex) select * from ods_users;
3.加快查询速度,分区表和其他表没有区别
select count(*) from myusers where sex='male';
多分区
1.创建多分区表
CREATE TABLE IF NOT EXISTS employee_partitioned (
name string,
work_place ARRAY<string>,
sex_age STRUCT<sex:string,age:int>,
skills_score MAP<string,int>,
depart_title MAP<STRING,ARRAY<STRING>>
)
partitioned by (year int,mouth int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE
;
2.添加和删除多分区
alter table employee_partitioned add
partition (year=2019,mouth=7)
partition (year=2020,mouth=7)
partition (year=2020,mouth=8)
;
alter table employee_partitioned drop
partition (year=2019,mouth=7)
;
表分区的增删改查
1.添加分区
alter table userinfos add partition (sex='female');
2.删除分区
alter table userinfos drop partition (sex='female');
3.查询分区
show partitions userinfos;
4.修复分区
修复分区就是重新同步hdfs上的分区信息。
msck repair table userinfos;