Hive的分区跟我们传统关系数据库的分区也是差不多,我们传统数库表分区是根据一个字段的内容进行换分成不同的数据块,以增加查询效率.同理Hive也是这样的但是也会有一些实现上的区别cuiyaoan2000@163.com.但是目的都是增加查询效率
海量的数据保存在hdfs的某一个hive表明对应的目录下,使用hive进行操作的时候,往往会搜索这个目录下的所有文件,这有时会非常的耗时
如果我们知道 这些数据的某些特征,可以事先对他们进行分裂,再把数据load到hdfs上的时候,他们就会被放到不同的目录下(注意这里体现在HDFS是文件目录).使用hive进行查询操作的时候,就可以在where子句中对这些特征进行过滤,那么对数据的操作就只会在符合条件的子目录下进行,其他不符合条件的目录下的内容就不会被读取,在数据量非常大的时候,这样节省大量的时间,这种把表中的数据分散到子目录下的方式就是分区表。
配置文件相关的配置信息:hive-site.xml
hive.exec.dynamic.partition=true; 是否允许动态分区
hive.exec.dynamic.partition.mode=strict/nostrict; 动态区模式为严格模式
hive.exec.max.dynamic.partitions=1000; 允许最大的动态分区
hive.exec.max.dynamic.partitions.pernode=100; 单个节点允许最大分区
非分区表
如果我们按照前文的方式创建一个表,没有指明分区信息,则为非分区表;如下所示.
hive> create table db_hive.student(cui string ,yao string ,nan string) row format delimited fields terminated by '\t';
通过命令可以查看该表是否为分区表.
hive> show partitions test_table;
如果为非去表则会显示异常,同时提示该表为非分区表.
分区表分为静态分区表和动态分区表.
区别就是静态分区表的分区值需要我们在插入或者创建的时候手动设置分区的值.动态分区表则是根据我们插入的值进行动态的创建归类cuiyaonan2000@163.com
静态分区表 创建分区多个分区的话就是一个目录层级的关系,所以我们的分区顺序要控制好.
首先创建表,然后在创建分区
#首先创建表
hive>create table test_partition_table(name string, age int) partitioned by (provice string,city string);
#插入一条记录,同时创建分区
hive>insert into test_partition_table partition(provice = "sichuan", city = "chengdu") values("cuiyaonan2000@163.com",18);
#查询记录
hive> select * from test_partition_table where city='chengdu';
新增分区
这里的新增分区指的是在上面创建的provice层的平级增加一个类似 beijing的分区cuiyaonan2000@163.com
#方式一:通过alter增加
hive>alter table test_partition_table add partition(provice = "hebei", city = "shijiazhuang");
#方式二:通过insert直接增加
hive>insert into test_partition_table partition(provice = 'hebei', city = 'shijiazhuang') values('tomslee',26);
删除分区
同理只是针对provice下的多个省的平级数据删除.
分区的删除涉及到对应的数据是否会被删除的问题,如果此表是内部表的话,那么分区的删除意味着对应目录下的数据会被删除,如果是外部表的话,分区的删除就不会删除对应的数据文件。cuiyaonan2000@163.com
hive>alter table test_partition_table drop partition (add = 'beijing');
动态分区表
首先是先创建分区表,跟静态分区表一样
#创建分区表
hive>create table test_partition_table(name string, age int) partitioned by (provice string,city string);
#创建分区,分区根据t1表中的字段country,state获取
hive>insert into table test_partition_table partition(country,state) select name,age,country,state from t1;
#也可以是有一个常量分区,一个动态分区这种组合的方式
hive>insert into table test_partition_tablepartition partition(country = 'US',state) select name,age,country,state from t1;