1 内部表
创建内部表语句:
create table dog(name string,id int) rowformat delimited fields terminated by " ";
a:本地加载数据 拷贝本地数据到/user/hive/warehouse/的对应目录下,所谓的对应是指对应的数据库的对应表目录下。本地数据不会删除。如果重复执行加载同一个数据的话,不会覆盖,会对相同文件加上后缀_copy_1
load data local inpath '/home/daxin/jdata/dog' into table dog;
b:本地加载Hdfs上的数据,会将hdfs上的文件移动到/user/hive/warehouse/的对应目录下。
c:删除内部表:会删除/user/hive/warehouse/对应的数据
结论: 内部表的数据由hive自身负责管理
2 外部表
a:本地加载数据:拷贝本地数据到/user/hive/warehouse/的对应目录下,本地数据不会删除。
Create external tabledog(name string,id int) row format delimited fields terminated by "";
load data localinpath '/home/daxin/jdata/dog' intotable dog; //加载本地数据,本地数据还在
drop table dog; //发现/user/hive/warehouse/目录下依旧存在数据,所以没有跟随表删除
b:本地加载Hdfs上的数据
load data inpath '/dog' into table dog; //加载hdfs数据会将数据移动到/user/hive/warehouse/目录下
drop table dog; //发现/user/hive/warehouse/目录下依旧存在数据,所以没有跟随表删除
再次创建表:Create external tabledog(name string,id int) row format delimited fields terminated by "";不进行加载数据,直接执行查询,发现可以直接插上上次外部表的数据。所以上面执行的删除表只是删除表的元数据而已。
结论: 外部表的数据不由hive自身负责管理,虽然数据会被加载到/user/hive/warehouse/,但是不由hive管理。
3 指定LOCATION
指定加载数据的位置,不再是默认加载到/user/hive/warehouse/目录下了。
a:内部表
Create table dog(name string,id int) rowformat delimited fields terminated by " " LOCATION '/jdata/dog1/';
加载数据时候这次是加载到/jdata/dog1/目录下,而不再是/user/hive/warehouse/目录,删除指定LOCATION的内部表的时候数据会一起删除。
b:外部表
Createexternal table dog(name string,id int) row format delimited fields terminatedby " " LOCATION'/jdata/dog1/';
加载数据时候这次是加载到/jdata/dog1/目录下,而不再是/user/hive/warehouse/目录。删除指定LOCATION的外部表,数据还在/jdata/dog1/存在
结论: 除了加载数据存放的位置不在是/user/hive/warehouse/,其余没有区别
4分区表
单个属性分区
创建分区表:
create table dog(name string,id int) partitionedby (sex string) row format delimited fields terminated by " ";
反例:
分区属性不能在创建表的属性集合中重复出现,例如:
reate table dog(name string,id int,sexstring) partitioned by (sex string) row format delimited fields terminated by" ";
报错:FAILED:SemanticException [Error 10035]: Column repeated in partitioning columns
分区表加载数据:
load data local inpath '/home/daxin/jdata/boy' into table dogpartition(sex="boy");
load data local inpath '/home/daxin/jdata/girl' into table dogpartition(sex="girl");
注意:sex属性是数据集里面没有的属性,这个是提前分类好的数据然后加载。
HDFS存储的数据结构:
删除和内部表外部表删除特性一致。
多个属性分区
两个属性分区为例:
create table dog(name string,id int) partitionedby (sex string,cate string) row format delimited fields terminated by "";
分区列表属性顺序是有影响的,例如partitionedby (sex string,cate string)
当我们有雌雄两种性别的泰迪、长毛时候,性别是一级分区标准,类别(cate)是耳机分区标准,这其实是一个树的结构,分区属性的先后表现在树的层次上。
例如此例:
多个属性可以根据分区删除数据:
alter table dog drop partition(sex='boy');执行之后sex=boy下面的taidi、changmao两种数据都会被删除。可以这么理解:树的根节点删除,子节点当然也跟随删除了。
alter table dog droppartition(sex='girl',cate='taidi'); 执行之后效果如下:
这个可以理解为直接删除树的叶子节点,不影响器兄弟节点。