分区表:
假设有海量的数据保存在HDFS的某个和hive表名对应的目录下,使用hive进行操作的时候,往往会搜索这个目录下的所有文件,这有时候是十分耗时的,如果我们知道这些数据的某些特征,可以事先对它们进行分类,再把数据load到HDFS上的时候,它们就会被放到不同的子目录下,然后使用hive进行操作的时候,就可以在where字句中对这些特征进行过滤,那么对数据的操作就只会在符合条件的子目录下进行,其他不符合条件的目录下的内容就不会被读取,在数据量非常大的时候,这样会节省大量的时间,这种把表中的数据分散的存放到子目录下的方式,就是分区表。
分区表,是hive优化手段之一,从目录的层面控制搜索数据的范围。
1)CREATE TABLE t3(id int,name string,age int) PARTITIONED BY (Year INT, Month INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
2)查看表结构
desc formatted t2 ;
3)//添加分区,创建目录
$hive>alter table t3 add partition (year=2014, month=11);
$hive>alter table t3 add partition (year=2014, month=12);
4)显式表的分区信息
$hive>SHOW PARTITIONS t3;
5)删除分区
hive>ALTER TABLE employee_partitioned DROP IF EXISTS PARTITION (year=2014, month=11);
6加载数据到分区表
hive>load data local inpath '/home/centos/customers.txt' into table t3 partition(year=2014,month=11);
数据:
1,zhangsan,15
2,lisi,22
3,wangwu,18
桶表
在hive中,数据库,表,分区都是对应到HDFS上的路径,当往表中上传数据的时候,数据会传到对应的路径下,形成新的文件,文件名的格式是00000_0_ ...,每次插入文件都会形成新的文件,命名也是有规律的,桶表就是对应不同的文件的。
1)创建桶表
$hive>CREATE TABLE t4(id int,name string,age int) CLUSTERED BY (id) INTO 3 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
2)加载数据不会进行分桶操作
$hive>load data local inpath '/home/centos/customers.txt' into table t4 ;
3)删除表不支持 delete from t4;
4)dfs -rmr /user/hive/watehouse/**
5) insert into t4 values(6,'jerry',10);
总结:分区表在文件夹上面进行过滤,桶表在文件上进行过滤