Hive与传统数据库的区别

来源:互联网 发布:windows 共享内存 编辑:程序博客网 时间:2024/05/29 03:34

Hive在很多方面和传统数据库类似(例如支持SQL接口),但是其底层对HDFS金额MapReduce的依赖意味着它的体系结构有 别于传统数据库,而这些区别又影响着Hive所支持的特性,进而影响着Hive的使用。

读时模式VS写时模式

在传统数据库里,表的模式是在数据加载时强制确定的。如果在加载时发现数据不符合模式,则被拒绝加载数据。因为数据是在写入数据库是对照模式进行检查,因此这一设计有时被称为“写时模式”(schema on write)。


在另外一方面,Hive对数据的验证并在不加载数据时进行,而在查询时进行。这称为“读时模式”(schema on read)。


用户需要在这两种方法之间权衡。读时模式可以使得数据加载非常迅速。这是因为它不需要读取数据,进行“解析”,再进行序列化以数据库内部格式存入磁盘。数据加载仅仅是文件的复制和移动。这一方法也更为灵活:试想,针对不同的分析任务,同一个数据可能会有两个模式。Hive使用‘’外部表’时,这种情况是可能发生的。


写时模式有利于提升查询性能。因为数据库可以对列进行索引,并对数据进行压缩。但是作为权衡,此时加载数据会花更多时间。此外没在很多加载时模式未知的情况下,因为查询尚未确定,因此不能决定使用何种索引。这些情况真是Hive“长袖善舞”的地方!


更新、事务和索引


更新、事务和索引都是传统数据库最重要的特性,但是,直到最近,Hive也没有考虑支持这些特性,因为Hive被设计为用MapReduce操作HDFS数据。在这样的环境下,“全表扫描”是常态操作,而表更新则是通过把数据表换后放入新表实现的。对于大规模数据集上的运行的仓库应用,这一方式很见效。

Hive不支持更新(或删除),但是支持INSERT INTO ,所以可以向现有的表中增加新的行。


在0.7.0发布的版本中,Hive引入索引,以在某些情况下加快查询的速度。对于SELECT * FROM t WHERE x=a在这样的查询中,因为只需要扫描表文件的一部分,因此可以利用在列x上的索引。目前索引分成两类:紧凑索引和位图索引。(索引的实现被设计为可插拔的,所以为了其他的目的而设计的索引实现会陆续出现)。


紧凑索引存储每个值的HDFS块号,而不是存储文件内偏移量。因此存储不会占用太多的磁盘空间,且对于值被聚簇存储于相近行的情况,索引任然有效。位图索引使用压缩的的位集合来高效存储具有某个特殊值的行。这种索引一般适合于具有较少取值可能的列。