创建分区表
1.静态分区表
create table parttable(id int,name string,age int)
partitioned by (sex string)
row format delimited
fields terminated by ','
lines terminated by'\n';
数据文件
vi parttable.txt
1001,zhangsan,19
1002,lisi,20
1003,wangwu,19
1004,lucky,21
load data local inpath '/home/parttable.txt' into table parttable partition(sex='M');
通过select 查询
insert into table parttable partition(sex='W') values(1005,'cindy',20);
通过select查询
在hdfs内查看
打开自动分区,设置分区模式为非严格模式
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
2.动态分区表
create table parttable01(id int,name string,age int)
partitioned by (sex string)
row format delimited
fields terminated by ','
lines terminated by'\n';
通过命令可以将parttable里的内容装载到parttable01
insert into table parttable01
partition(sex)
select * from parttable;
一次命令就成功
Select 查询
在hdfs内查看
再次尝试血型表
use sy3;
重新创建血型动态分区表
create table blood(name string, sex int ,nation string, age int ,depart string,major string,height int,weigh int,xiongwei double,feihuoliang int,score int )
partitioned by (blood string)
row format delimited
fields terminated by ','
lines terminated by'\n';
ah表内有所有学生信息
insert into table blood
partition(blood)
select * from ah;
Select * from blood where blood=’A’;
hdfs查看
3.总结思考
静态分区 SP(static partition)
1、静态分区是在编译期间指定的指定分区名
2、支持load和insert两种插入方式
2.1load方式
1)会将分区字段的值全部修改为指定的内容
2)一般是确定该分区内容是一致的时候才会使用
2.2insert方式
1)必须先将数据放在一个没有设置分区的普通表中
2)该方式可以在一个分区内存储一个范围的内容
3)从普通表中选出的字段不能包含分区字段
3、适用于分区数少,分区名可以明确的数据
动态分区 DP(dynamic partition)
1、根据分区字段的实际值,动态进行分区
2、是在sql执行的时候进行分区
3、需要先将动态分区设置打开(set hive.exec.dynamic.partition.mode=nonstrict )
4、只能用insert方式
5、通过普通表选出的字段包含分区字段,分区字段放置在最后,多个分区字段按照分区顺序放置。
静态分区表和动态分区表的优缺点:
对于处理分区数比较少的数据,使用静态分区表或是动态分区表都可以。像血型分区或时间分区,分区个数比较多的数据,使用动态分区表,一条命令可以完成所有分区,十分便捷,高效。动态分区的缺点是使用前需要打开自动分区,设置分区模式为非严格模式。尝试使用load向静态分区表篇插入数据,发现是可行的,但命令需要像静态分区表一样,指定分区,相比insert更为复杂。