一、 Hive与传统数据库的比较

1.如图

hive 存储 宽表 hive表存储格式的区别_big data

查询语言
类SQL的查询语言HQL。熟悉Sql开发的开发者可以很方便的使用Hive开发。
数据存储位置
所有Hive的数据都是存储在HDFS中的。而数据库可以将数据存储在块设备中
或本地存储文件系统中。
数据格式
Hive中没有定义专门的数据格式。而在数据库中,所有数据都会按照一定的组织
存储。正因如此,数据库加载数据的过程比较耗时。
数据更新
Hive对数据的添加、改写比较弱化,0.14以后版本支持,需要启动配置项。而
数据库通常是需要经常进行修改的。
索引
Hive在加载数据的过程中不会对数据进行任何处理。因此,访问延迟较高。数据库
可以有很高的效率,较低的延迟。由于数据的访问延迟较高,所以Hive不适合在线
数据查询。
执行计算
Hive是通过MapReduce来实现的,而数据库通常有自己的执行引擎
数据规模
由于Hive建立在集群上并且可以利用MapReduce进行并行计算,所以可以执行很
大规模的数据,对应的数据库可以执行数据规模较小。

二、Hive的存储格式

  • Hive的存储基于Hadoop HDFS
  • Hive没有专门的数据格式

1.TEXTFILE

TEXTFILE 即正常的文本格式,是Hive默认文件存储格式,因为大多数情况下源
数据文件都是以text文件格式保存(便于查看验数和防止乱码)。此种格式的表
文件在HDFS上是明文,可用hadoop fs -cat命令查看,从HDFS上get下来后也
可以直接读取。TEXTFILE 存储文件默认每一行就是一条记录,可以指定任意的分
隔符进行字段间的分割。但这个格式无压缩,需要的存储空间很大。虽然可结合Gz
ip、Bzip2、Snappy等使用,使用这种方式,Hive不会对数据进行切分,从而无
法对数据进行并行操作。一般只有与其他系统由数据交互的接口表采用TEXTFILE
 格式,其他事实表和维度表都不建议使用。

2.SEQUENCEFILE

SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,val
ue>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writ
able 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的
Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它key
为空使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程
SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低
一般建议使用BLOCK压缩。 SequenceFile最重要的优点就是Hadoop原生支持较
好有API,但除此之外平平无奇,实际生产中不会使用

3.AVRO

Avro是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑,若
要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。并且Avro数据
文件天生是带Schema定义的,所以它不需要开发者在API 级别实现自己的Writ
able对象。Avro提供的机制使动态语言可以方便地处理Avro数据。最近多个
Hadoop 子项目都支持Avro 数据格式,如Pig 、Hive、Flume、Sqoop和Hcata
log。

4.RCFILE

Record Columnar的缩写。是Hadoop中第一个列文件格式,能够很好的压缩和快
速的查询性能。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和
计算量。 RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,
保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数
据列式存储,有利于数据压缩和快速的列存取

5.ORCFILE

Hive从0.11版本开始提供了ORC的文件格式,ORC文件不仅仅是一种列式文件存储
格式,最重要的是有着很高的压缩比,并且对于MapReduce来说是可切分 Split
的。因此,在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HD
FS存储资源,而且对数据的查询和处理性能有着非常大的提升,因为ORC较其他文
件格式压缩比高,查询任务的输入数据量减少,使用的Task也就减少了。ORC能很
大程度的节省存储和计算资源,但它在读写时候需要消耗额外的CPU资源来压缩和
解压缩,当然这部分的CPU消耗是非常少的

6.PARQUET

通常我们使用关系数据库存储结构化数据,而关系数据库中使用数据模型都是扁平
式的,遇到诸如List、Map和自定义Struct的时候就需要用户在应用层解析。但
是在大数据环境下,通常数据的来源是服务端的埋点数据,很可能需要把程序中的
某些对象内容作为输出的一部分,而每一个对象都可能是嵌套的,所以如果能够原
生的支持这种数据,这样在查询的时候就不需要额外的解析便能获得想要的结果。
Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌
套结构的存储格式,并且使用了列式存储的方式提升查询性能。Parquet仅仅是
一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定
这也是parquet相较于orc的仅有优势:支持嵌套结构。Parquet 没有太多其他
可圈可点的地方,比如他不支持update操作(数据写成后不可修改),不支持ACID等
  • 四大常用存储格式对比