1、管理表
管理表也称为内部表,这种表或多或少的控制数据的生命周期,Hive在默认情况下会将这些表存储在配置项为hive.metastore.warehouse.dir所定义的目录中。管理表存在一些不足,不方便与其他工作共享数据,例如当有一份数据由pig或其他工具所创建并且主要由这一工具所使用,此时,如果我们需要hive对这份数据执行一些查询,可是并没有给予Hive对数据的所有权,我们可以再创建一个外部表指向该份数据,而不需要具备对其所有权。
创建一个管理表一般形式:
create table Testtable1(
testid int,
testname string,
testvalue int
);
2、外部表
Hive不会认为外部表完全拥有他所指向的那份数据,也就是说当删除该外部表时,并不会删除该份数据,不过描述该表的元数据信息会被删除。与之不同的内部表,当删除该外部表时,hive也会删除这个表的数据
创建一个外部表一般形式:
create external table Testtable2(
testid int,
testname string,
testvalue int
)
row format delimited fields teminated by ','
location '/data/test';
其中row format delimited fields teminated by ‘,’表示按照一个逗号来分割表,也可以换成其他的符号,location的话表示hive的数据会存在那个路径下。
3、分区表
为什么会存在分区表了?
通过分区来水平分散压力,将数据从物理上转移到和使用最频繁的用户最近的地方,在hive中分区表还存在分层存储。
3.1、分区内部表
假如公司的人员来自全世界,在查询中往往会使用带WHERE语句的查询,这样可以将结果限制在某个国家或某个省份,按country(国家),再按state(州)来对数据进行分区
create table employee(
name string,
salary float,
subordinates array<string>,
deductions map<string,float>,
address struct<stree:string, city:string, state:string, zip:int>
)
partitioned by (country string, state string);
分区表会改变hive对数据存储的组织方式,如上所创建的这个表会创建一个employee的目录,并在这个目录下面,根据country和state的字段进行存储。对数据进行分区,最重要的原因就是为了更快的查询。可以用show partitions命令查看表中存在的所有分区。
show partitions employees;
//查看某特定分区下的分区
show partitions employees partition(country='US');
//其他命令显示分区建
describe extendedemployees;
3.2、分区外部表
外部表同样可以使用分区,通过alter table语句可以进行单独增加分区
alter table log_test add partition(year-2012,month=1,day=2)