Hive关于内部表外部表以及分区表数据删除总结

Posted javartisan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive关于内部表外部表以及分区表数据删除总结相关的知识,希望对你有一定的参考价值。

 

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'); 执行之后效果如下:




这个可以理解为直接删除树的叶子节点,不影响器兄弟节点。



以上是关于Hive关于内部表外部表以及分区表数据删除总结的主要内容,如果未能解决你的问题,请参考以下文章

Hive内部表、外部表、分区表、桶表概述

Hive常用命令

hive外部表分区

6.1 Hive学习总结

关于Hive的调优(本身,sql,mapreduce)

hive学习10之分区表 外部表 内部表