Hive内部表和外部表

  1. hive创建内部表

hive> CREATE TABLE hT1(id INT,name STRING,hobby ARRAY,address MAP)

    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    > COLLECTION ITEMS TERMINATED BY '-'

    > MAP KEYS TERMINATED BY ':';

OK

Time taken: 0.22 seconds

hive> show tables;

OK

ht1

Time taken: 0.066 seconds, Fetched: 1 row(s)

说明:每一行的数据定义为’,’来分割,Collection的条目以’-’来分割,Map的条目以’:’来分割。

可以看到表已经创建成功了。

去WEB UI中查看

Hive内部表和外部表_第1张图片

Hive内部表和外部表_第2张图片

加载数据:

  1. 准备数据

id,name,hobby,address

1,张三,篮球-足球-音乐,北京:上海

2,李四,看书-旅游-爬山,西安:成都

3,王五,钢琴-小提琴-古筝,重庆:杭州

4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳

  1. 加载数据

hive> LOAD DATA LOCAL INPATH '/root/data/hdata1' INTO TABLE ht1;

Loading data to table default.ht1

Table default.ht1 stats: [numFiles=1, totalSize=207]

OK

Time taken: 2.362 seconds

说明: local代表数据来自与本地磁盘,如果是来自hdfs的话,则去掉local。

查看ht1表中的数据:

hive> select * from ht1;

OK

NULL name ["hobby"] {"address":null}

1 张三 ["篮球","足球","音乐"] {"北京":"上海"}

2 李四 ["看书","旅游","爬山"] {"西安":"成都"}

3 王五 ["钢琴","小提琴","古筝"] {"重庆":"杭州"}

4 赵六 ["抽烟","喝酒","烫头发"] {"哈尔滨":"沈阳"}

Time taken: 0.752 seconds, Fetched: 5 row(s)

同样可以用hadoop命令查看hdfs上的这些数据:

[root@unisk01 ~]# hadoop fs -cat /user/hive/warehouse/htest.db/ht1/*

id,name,hobby,address

1,张三,篮球-足球-音乐,北京:上海

2,李四,看书-旅游-爬山,西安:成都

3,王五,钢琴-小提琴-古筝,重庆:杭州

4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳

  1. 创建外部表

hive> CREATE EXTERNAL TABLE hET1(id INT,name STRING,hobby ARRAY,address MAP)

    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    > COLLECTION ITEMS TERMINATED BY '-'

    > MAP KEYS TERMINATED BY ':'

    > LOCATION '/hive/external/hET1';

OK

Time taken: 0.299 seconds

hive> desc formatted hET1;

OK

# col_name             data_type            comment             

   

id                   int                                      

name                 string                                   

hobby                array                            

address              map                       

   

# Detailed Table Information    

Database:            default               

Owner:               root                  

CreateTime:          Sat Aug 04 09:56:19 CST 2018  

LastAccessTime:      UNKNOWN               

Protect Mode:        None                  

Retention:           0                     

Location:            hdfs://mycluster/hive/external/hET1  

Table Type:          EXTERNAL_TABLE        

Table Parameters:    

EXTERNAL             TRUE                

transient_lastDdlTime 1533347779          

   

# Storage Information    

SerDe Library:       org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  

InputFormat:         org.apache.hadoop.mapred.TextInputFormat  

OutputFormat:        org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  

Compressed:          No                    

Num Buckets:         -1                    

Bucket Columns:      []                    

Sort Columns:        []                    

Storage Desc Params:    

colelction.delim     -                   

field.delim          ,                   

mapkey.delim         :                   

serialization.format ,                   

Time taken: 0.156 seconds, Fetched: 33 row(s)

说明:创建表时加上一个External字段,意思是外部表,并且最后加上Location用来指定外部表存放目录。通过查看表格式的命令,可以查看详细的内容。

查看WEB UI发现外部表的数据并没有在hive自己仓库的目录下

Hive内部表和外部表_第3张图片

外部表和内部表的区别:

它两主要区别在于LOAD和DROP这两个命令语义上:

内表使用load命令会把数据移到自己仓库目录下

外表使用load命令会把数据移到自己仓库以外的位置

内表使用drop命令会把元数据和数据一起删除(这也就是为什么内表也叫托管表)

外表使用load命令只会删除元数据

到底该选择哪一种方式呢?

有一个经验法则:

如果所有处理都由hive完成,应使用内表

如果要用hive和其他工具来处理同一个数据集应该使用外表

经常的使用场景:

把存在HDFS上的初始数据集用作外部表进行使用,然后用hive的变换功能把数据迁移到托管hive的表。

所以我们试着删除外部表:

hive> drop table hET1;

OK

Time taken: 0.206 seconds

hive> show tables;

OK

ht1

Time taken: 0.063 seconds, Fetched: 1 row(s)

hive>

然后去HDFS目录中查看

[root@unisk01 ~]# hadoop fs -cat /hive/external/tET1/*

id,name,hobby,address

1,张三,篮球-足球-音乐,北京:上海

2,李四,看书-旅游-爬山,西安:成都

3,王五,钢琴-小提琴-古筝,重庆:杭州

4,赵六,抽烟-喝酒-烫头发,哈尔滨:沈阳

[root@unisk01 ~]#

的确数据依然存在,那么再看一下删除内部表:

去WEB UI查看,也的确看到这个数据文件依然存在

Hive内部表和外部表_第4张图片

hive> drop table ht1;

OK

Time taken: 2.05 seconds

hive> show tables;

OK

Time taken: 0.05 seconds

hive>

然后去HDFS目录中查看:

Hive内部表和外部表_第5张图片

发现htest.db库下已经没有ht1表了。

你可能感兴趣的:(Hive)