hive中表的两种基本类型
1)、内部表(managed)--默认
2)、外部表(external)
简介
本文将介绍内部表及外部表的一些差异点,不过hive中内部表与外部表根本的差异在于表是否拥有自己的数据。
这意味着表数据以及表属性只能通过hive的命令进行更改,而实际上因为数据文件保存在文件系统上,任何有权限的人都有可能绕过hive对其作出更改,如果更改操作违反了hive对文件要求的不变性及hive对文件格式和内容的期望,则最终hive返回的结果很有可能是用户所不希望看到的;
内部表的另一个特性是数据都追加到hive实体中,举例来说,每当改变hive实体数据时,其对应的数据也将发生改变。这与传统的RDBMS非常类似--更改数据库数据都是基于SQL的访问权限来操作而非直接修改数据文件;
而对于外部表,hive认为其不管理数据;
使用上可以通过使用命令查看表的详细信息:
hive> desc formatted table_name;
其中一项table type指明了当前表类型是MANAGED_TABLE还是EXTERNAL_TABLE ;
特性比较
内部表与外部表存在以下但不完全的特性差异:
ARCHIVE/UNARCHIVE/TRUNCATE/MERGE/CONCATENATE命令只能在内部表上进行使用;
DROP操作将会删除内部表的元数据及数据信息,而对于外部表则仅仅删除元数据信息;
ACID的事务特性仅仅适用于内部表;
查询结果缓存只适用于内部表;
外部表的表约束只支持RELY操作;
一些物化视图的特性只适用于内部表;
内部表(managed table)
内部表信息存储在由hive.metastore.warehouse.dir指定的属性目录下,默认的文件路径类似于/user/hive/warehouse/databasename.db/tablename/;
默认的存放路径可以在创建表时显式指定覆盖;
针对于内部表或分区表,当进行drop操作时,其表中的数据以及表的元数据信息均会被删除;
如果操作未指定为PURGE,则数据将会被移动到回收目录;
当使用场景是希望hive来管理表的生命周期时或者是生成临时表时则应该使用内部表进行存储;
外部表(external table)
一个外部表仅仅描述和记录了外部文件的元数据,其关联的文件同样可以由hive外部的进程访问及管理;
外部表可以访问由本地文件系统或者hdfs管理的文件数据;
如果外部表的结构或者分区结构发生变更,可以通过使用命令对外部表的元数据进行更新:
hive> msck repair table tablename
使用外部表的另一个原因是文件已经存在或存在远程机器上,并且希望该文件在表结构删除的情况下数据依然能够得以保留;