hive的数据都存储在HDFS,主要是指Hive中的数据模型存储。Hive中的数据存储单元结构有:数据库Database、表table(内部表table、外部表external table)、分区partition、桶或簇 Buckets or Clusters。
1, 数据库 Database
在HDFS上对应相应的数据存储目录,通过hive的配置文件hive-site.xml的hive.metastore.warehouse.dir属性来配置。通过create database data_name命令创建。与传统的关系型数据库一样,数据库是一个名称空间,作用是避免表、视图、分区、列等的命名冲突。数据库还可用于为用户或用户组实施安全性。
2,表table
与传统的关系型数据库一样,具有相同模式的同质数据单元。每个表在hive中都是Database路径下的一个存储目录,在hive中知道一个表的存储路径可以通过hive命令 desc formatted table_name 显示表的详细信息;hive的表分为内部表和外部表
内部表:数据由Hive自身管理,存储的位置是hive在hdfs中存在默认的存储路径,即default数据库(默认:/user/hive/warehouse),删除内部表会直接删除元数据(metadata)及存储数据,对内部表的修改会将修改直接同步给元数据。
外部表:数据由HDFS管理,存储的位置由自己指定,可以指定除/user/hive/warehouse以外的路径,删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE
table_name)
3,分区partition
每个表可以有一个或多个分区键,用于确定数据的存储方式。分区除了作为存储单元外,还允许用户有效地识别满足指定条件的行;在hive中,表中的每个partition对应于表下的一个子存储目录。分区键的每个唯一值定义了表的一个分区,分区列(Partition columns)是虚拟列,它们不是数据本身的一部分,而是在加载时派生的。
4,桶或簇 Buckets or Clusters
每个分区中的数据又可以基于表的散列函数值被划分为桶。每个Buckets对应一个存储文件。如果表有分区,文件保存在分区目录下,如果没有分区,文件保存在表目录下。