Hive分区的概念与传统关系型数据库分区不同。
传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区。
Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。
Hive分区的创建
Hive分区是在创建表的时候用Partitioned by 关键字定义的,但要注意,Partitioned by子句中定义的列是表中正式的列,但是Hive下的数据文件中并不包含这些列,因为它们是目录名。
静态分区
创建一张静态分区表par_tab,单个分区
create table par_tab (name string,nation string) partitioned by (sex string) row format delimited fields terminated by ',';
这时候通过desc查看的表结构如下
hive> desc par_tab; OK name string nation string sex string # Partition Information # col_name data_type comment sex string Time taken: 0.038 seconds, Fetched: 8 row(s)
准备本地数据文件par_tab.txt,内容 “名字/国籍”,将以性别(sex)作为分区
jan,china
mary,america
lilei,china
heyong,china
yiku,japan
emoji,japan
把数据插入到表(其实load操作相当于把文件移动到HDFS的Hive目录下)
load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab partition (sex='man');
这时候在hive下查询par_tab表,变成了3列,注意。
hive> select * from par_tab; OK jan china man mary america man lilei china man heyong china man yiku japan man emoji japan man Time taken: 0.076 seconds, Fetched: 6 row(s)
查看par_tab目录结构
[hadoop@hadoop001 files