Hive组织表到分区。它是将一个表到基于分区列,如日期,城市和部门的值相关方式。使用分区,很容易对数据进行部分查询。
例如,一个名为Tab1表包含雇员数据,如 id, name, dept 和yoj (即加盟年份)。假设需要检索所有在2012年加入,查询搜索整个表所需的信息员工的详细信息。但是,如果用年份分区雇员数据并将其存储在一个单独的文件,它减少了查询处理时间。
1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
2、表和列名不区分大小写。
3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
分区的作用是什么呢,我的理解就是可以更方便的管理数据,以及在查询的时候,做到快捷,准确。
比如说存储了一份日志文件,有好几个月,那我们这个时候,以一天或者一个星期为一个分区,到时候查看日志文件的时候,就可以到指定的时间段去查找,就很方便。
首先在创建表的时候,可以指定自己的分区的类型和字段。
create table psn5(
id INT,
name String,
hobby ARRAY<String>,
add MAP<String,String>)
PARTITIONED BY (SEX String)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':';
创建之后,当你导入数据的时候,需要制定分区,不然就会报错。
像这样才是正确的: LOAD DATA LOCAL INPATH '../data.txt' INTO TABLE psn5 PARTITION (sex='girl');
LOAD DATA LOCAL INPATH '../data.txt' INTO TABLE psn5 PARTITION (sex='boy');
然后当我们创建分区之后,去hdfs上查看文件系统,会发现,psn5这个表下面有两个文件夹(sex=boy,sex=girl) 正好对应着两个分区的名字。
如果想要查询某个分区下的数据:
SELECT * FROM TABLENAME WEHRE sex='girl';
分区支持增加,删除等操作
Add Partitions
|
Rename Partition
Version information
As of Hive 0.9.
|
Drop Partitions
|
You can use ALTER TABLE DROP PARTITION to drop a partition for a table. This removes the data and metadata for this partition. The data is actually moved to the .Trash/Current directory if Trash is configured, unless PURGE is specified, but the metadata is completely lost (see Drop Table above).