Hive的存储是建立在Hadoop文件系统之上的,Hive本身没有专门的数据存储格式,也不能为数据建立索引,因此可以自由的组织Hive中的表。在创建表的时候只需要告诉Hive数据中的列分隔符和行分隔符就可以解析数据。

        Hive中主要包含四类数据模型:表,外部表,分区和桶。

表:

        Hive中的表和数据库中的表在概念上是类似的,在Hive中每一个表都有一个对应的存储目录。在配置文件hive-site.xml中hive.metastore.warehouse.dir指定的就是数据仓库的目录,所有的表数据,除了外部表都保存在这个目录中。



外部表:

        外部表指向已经在HDFS中存在的数据,也可以对外部表创建分区。外部表和表在元数据的组织上是相同的,在实际数据的存储存在差异:


        (1)创建表的操作包含两个步骤:表创建过程和数据加载过程,一般情况下先创建表再加载数据,当然这两个过程也可以在同一个语句中完成。在数据加载过程中,实际的数据会移动到数据仓库的目录下,之后的数据访问会直接在数据仓库目录中完成。在删除表时,表中的数据和元数据将会被同时删除。


        (2)外部表的创建只有一个步骤,加载数据和创建表同时完成,实际数据存储在创建语句LOCATION指定的HDFS路径中,并不会移动到数据仓库目录中。如果删除一个外部表,仅删除元数据,表中的数据并不会被删除。



分区:

        Hive中的每一个分区都对应数据库中相应分区列的一个索引,但是其分区列的组织方式和传统的关系型数据库不同。在Hive中,表中的一个分区对应表下的一个目录,所有分区的数据都存在对应的目录中。



桶:

        桶在对指定列进行HASH计算时,会根据hash值切分数据,使每一个桶对应一个文件。