Hive是Hadoop生态圈中实现数据仓库的一项技术。虽然Hadoop和HDFS的设计局限了Hive所能胜任的工作,但是Hive仍然是目前互联网中最适合数据仓库的应用技术。 不论从“品相还是举止”,Hive都像一个关系型数据库。用户对数据库、表和列这类术语比较熟悉的话,那么掌握Hive的查询语言HQL也轻而易举。不过,Hive的实现和使用方式与传统的关系数据库相比,有很多不同的地方。
我们Hive的第一篇文章就将讲到Hive数仓中模式设计的三板斧:内部表和外部表、分区和分桶以及序列化/反序列化(SerDe)
一. 内部表和外部表
Hive将数据表分为内部表和外部表。
内部表
在Hive中创建的普通表都可称作“内部表”。因为Hive可以(或多或少)控制其数据的生命周期,内部表对数据拥有所有权。如我们所见,通常Hive会将内部表的数据储存在由hive.metastore.warehouse.dir所定义的目录下。
所以,当删除一个内部表时,相应的数据也会被删除。
外部表
内部表不方便共享数据源。例如,当采用如Pig或MapReduce等技术工具进行数据处理时,我们将无法读取内部表的数据,也不能将外部数据直接作为内部表数据源分享给Hive。这样的需求就诞生了外部表。不同于内部表,Hive 对外部表的数据仅仅拥有使用权,而数据位置可由表管理者任意配置。
如何理解外部表呢?
如图所示,外部表不需要将数据复制到Hive中。一旦关联上数据格式和数据位置,Hive就能直接访问外部数据,非常灵活方便,即插即用。
而加载内部表数据时,Hive会自动将源数据拷贝到内部。内部表其实访问的是数据副本。
注意,Hive加载内部表数据后会把数据源删除,很像"剪切/移动"。所以,往内部表上传数据时,千万记得备份!