hive中创建表分区:
分区什么时候用?
例子1:
假如我有一个log日志表,我要对其建立分区的话,可以通过时间来建立分区,意思就是,我每天的数据都会存到一个目录中
例子2:
假如我这个日志表是不同类型的信息,我可以通过分区,对其分开进行管理
创建分区的代码
创建分区的代码要写在上面,如下,我写的是将性别进行分区
注意:
你不能写成 name String,也就是分区字段不能与创建表的字段一致,否则会报错
create table psn1(
id int,
name String,
likes Array
address Map
)
partitioned by (sex String)
row format delimited
fields terminated by ',' //我们将上面的原始数据按照','进行分割,分成4个字段
collection items terminated by ‘-’ //我们将上面的第3个字段定义成了数组,因此要对该数组进行分割
map keys terminated by ‘:’ //我们将上面的第4个字段定义成了Map,因此要对Map进行分割
将数据存到分区表中:
load data local inpath ‘/~/~/~/data.txt’ overwrite into table psn1;
注意:
此时是会报错的,因为这个分区表里面有个分区字段性别(“sex”)
正确写法:
load data local inpath ‘/~/~/~/data.txt’ overwrite into table psn1 partition (sex=’boy’);
解释:
我将该数据存到了这个分区表中,并为该数据定义的分区是男孩,也就是该数据中的人,性别都是男的
此时我再将另外的数据存到该表中但是分区我定义的是girl
load data local inpath ‘/~/~/~/data1.txt’ overwrite into table 表名 partition (sex=’girl’)
可以查看该表的数据:
可以查看该表在hdfs上的表现:
查找分区中的数据:
通过上面的操作我们现在可以知道,在psn1这个表的下面此时有2个分区
查询指定分区’boy’分区下面的数据
select * from psn1 where sex=’boy’;
对表增加分区:
例如上面的psn1这个分区表,我对其新添加一个分区
alter table psn1 add partition(sex= ’weizhi’ )
意思就是我对这个分区的字段sex,新添加了一个分区weizhi(未知),可以将我的数据中不清楚是男是女的填入到该分区中。
删除表的分区:
如果是一个内部表的话,那么对应的该分区中的数据也会被清除
ALTER TABLE psn2 drop PARTITION (sex='weizhi');
创建表的时候添加2个分区字段;
那么我添加数据的时候就不能写成一个了:
create table psn1(
id int,
name String,
likes Array
address Map
)
partitioned by (sex String,age int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
添加数据的时候就必须要指定2个分区字段了
load data local inpath ‘/~/~/~/data.txt’ overwrite into table psn1 partition
(sex=’boy’,age=1);
表示的是:我将该数据添加到是男孩,并且年龄是1的分区表中
注意:
这种多个分区字段的表,再hdfs上会生成一个主目录,sex=boy,再这个目录下面会有age=1这个目录。
所以删除的时候如下代码:
alter table psn1 add partition(sex= ‘boy’)
会将该主目录下的所有数据都会删除