Hive总结(三)内部表和外部表的区别

零.Hive数据库存储四种方式的区别

内部表:Hive中的表和关系型数据库中的表在概念上很类似,每个表在HDFS中都有相应的目录用来存储表的数据,这个目录可以通过/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来配置,这个属性默认的值是在HDFS上的/user/hive/warehouse,所有的Hive内部表存储在这个位置。
外部表:
Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是不会被删除的,它只会删除外部表对应的元数据;而如果你要删除内部表,则对应的所有数据包括元数据都会被删除。
Partitions:分区
Hive可以对数据按照某列或者某些列进行分区管理,将数据组织成分区,每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。
这样可以提高数据的查询速度。至于用户存储的每一条记录到底放到哪个分区,由用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。
Buckets (or Clusters):分桶
Hive可以对于每一个表或者分区组织成桶。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。采用桶能够带来一些好处,比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

一.表和外部表的区别

1.在本地建立数据文件

/data/hive$ cat data_storage.txt
3Duwei30,houwei
4Lixuepeng28,houwei
7Wulei4,qianfeng
10Zhenzhi35,zhongchang

2.内部表和外部表和外部表的区别
内部表

hive> create table hivedb_storage
    > (id int, name string, age int,weizhi string)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY '\t'
    > STORED AS TEXTFILE;
OK
Time taken: 0.106 seconds

加载本地数据

hive> load data local inpath '/home/santiago/data/hive/data_storage.txt' into table 
hivedb_storage;
Loading data to table data_storage.hivedb_storage
Table data_storage.hivedb_storage stats: [numFiles=1, totalSize=173]
OK
Time taken: 0.379 seconds

查验数据文件夹

hive> dfs -ls /usr/hive/warehouse;
Found 1 items
drwxrwxr-x   - santiago supergroup          0 2017-02-16 15:40
/usr/hive/warehouse/data_storage.db
hadoop fs -ls /usr/hive/warehouse/data_storage.db
Found 1 items
drwxrwxr-x   - santiago supergroup          0 2017-02-16 15:41 
/usr/hive/warehouse/data_storage.db/hivedb_storage

外部表
先在HDFS上建目录存放数据目录

hadoop fs -mkdir /usr/hive/test_data
#hadoop fs -ls /usr/hive/
Found 1 items
drwxr-xr-x   - santiago supergroup          0 2017-02-16 15:55 /usr/hive/test_data
hive> create external table hiveexter_storage
    > (id int, name string, age int,weizhi string)
    > location '/usr/hive/test_data';
OK
Time taken: 0.345 seconds
hive> load data local inpath '/home/santiago/data/hive/data_storage.txt' into table 
hiveexter_storage;
OK
Time taken: 0.949 seconds

测试的数据写入成功

#hadoop fs -ls /usr/hive/test_data
Found 1 items
-rwxr-xr-x   1 santiago supergroup         85 2017-02-16 16:09 
/usr/hive/test_data/data_storage.txt

删除内外部表查看HDFS系统数据是否存在

hive> drop table hivedb_storage;
OK
Time taken: 0.541 seconds
hive> drop table hiveexter_storage;
OK
Time taken: 0.162 seconds

查看HDFS系统内部表外部表所存储位置
外部表

$ hadoop fs -ls /usr/hive/test_data
Found 1 items
-rwxr-xr-x   1 santiago supergroup         85 2017-02-16 16:09 
/usr/hive/test_data/data_storage.txt
$ hadoop fs -cat /usr/hive/test_data/data_storage.txt
3,Duwei,30,houwei
4,Lixuepeng,28,houwei
7,Wulei,24,qianfeng
10,Zhenzhi,35,zhongchang

内部表
$ hadoop fs -ls /usr/hive/warehouse/data_storage.db数据为空。

总结

一下Hive中表与外部表的区别:
1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而表则将数据存储于设置位置/usr/hive/warehouse。
2、在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的。
所以,在大多数情况内部表和外部表没有太多的区别,如果所有处理都需要由Hive完成,那么你应该创建表,否则使用外部表较为好。因为外部表只删除表不删除数据,所以采用外部表。

你可能感兴趣的:(hive)