在实际进行大数据分析时,由于某些时候需要即席查询,对性能要求很高。此时有多种方案可选,比如采用Spark,Impala,Phoenix,Tez等都是可以选择。但在底层的数据存储结构上,一般都是借助于Hive的数据存储结构。因此需要学习下Hive本身的数据是如何存储的。
Hive中的基本概念有Table,Extenal Table,Parition,Bucket等。其中最关键的是Table和Partition.
Hive中的Table和关系型数据库中的Table概念类似,都有表名,字段名和字段类型的属性。
Partition的概念则不同于关系型数据库中的索引。Partition在Hive中表现为Table下面的子目录树。Partition的列,并不保存在Table中,而是伪列,即原始数据中并没有Partition的列。
Partition既可以是Static的,也可以是Dynamic的。Static是指分区预先创建好,Dynamic则指分区动态创建。在实际使用中,由于源数据并不确定,因此更为灵活的方式是使用Dynamic来创建分区。
为提高效率,一般使用Load Data或者Load Local Data来加载数据,此时是将文件直接copy到对应的Partition下面。
Partition,有点类似于多级索引,显然可以大大提升查询的效率,因为使用Partition后,查询可以直接在小范围内进行。
对于有保存时间要求的系统,如果按照日期进行Partition,对于维护就比较简单,可以直接删除过期的分区即可。删除分区后,元数据和分区数据会一并删除。