Hive是建立在Hadoop文件系统(HDFS)之上的数据仓库工具,支持多种数据存储格式。以下是Hive支持的常用存储格式:

文本文件(Text File):

文本文件是最基本的存储格式之一,适合存储结构简单、数据量小的数据。在Hive中,文本文件可以使用逗号分隔符(CSV)、制表符分隔符(TSV)或其他自定义分隔符来存储数据。

在Hive中,可以使用文本文件存储格式,具体实现如下:

CREATE TABLE my_table (
  col1 STRING,
  col2 INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

上述代码创建了一张名为my_table的表,包含两列数据:col1和col2。文本文件存储格式使用逗号作为字段分隔符,每行数据以换行符结束。数据存储在HDFS中,以文本文件的形式存储。

原理解释

文本文件存储格式是最基本的存储格式之一,它将数据存储在文本文件中,每行数据以换行符结束,字段之间使用分隔符进行分隔。在Hive中,文本文件存储格式使用ROW FORMAT DELIMITED关键字指定字段分隔符和行结束符,例如FIELDS TERMINATED BY ','指定字段分隔符为逗号,而STORED AS TEXTFILE指定存储格式为文本文件。

优缺点比较

文本文件存储格式的优点包括:

  • 简单易用,不需要额外的存储引擎或格式转换工具;
  • 通用性强,几乎可以存储任何类型的数据;
  • 可读性强,方便数据的查看和编辑;
  • 存储成本低,不需要额外的存储空间。

文本文件存储格式的缺点包括:

  • 存储效率低,数据量大时容易导致查询性能下降;
  • 不支持数据压缩,存储空间较大;
  • 不支持数据类型的自动转换,需要手动进行数据类型转换和数据清洗。

总之,文本文件存储格式是一种简单易用、通用性强的存储格式,适合存储结构简单、数据量不大的数据。但是,由于存储效率低、不支持数据压缩和数据类型自动转换等缺点,不适合存储大规模的数据和高性能的查询场景。

序列文件(Sequence File):

序列文件是一种Hadoop自带的二进制文件格式,适合存储大量数据,且支持高速读取和写入。在Hive中,序列文件可以存储任何类型的数据。

在Hive中,可以使用序列文件存储格式,具体实现如下:

CREATE TABLE my_table (
  col1 STRING,
  col2 INT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.hadoop_sequencefile_serde'
STORED AS SEQUENCEFILE;

上述代码创建了一张名为my_table的表,包含两列数据:col1和col2。序列文件存储格式使用Hadoop自带的序列化库将数据存储在二进制文件中,可以存储任何类型的数据。

原理解释

序列文件存储格式使用Hadoop自带的序列化库将数据存储在二进制文件中,可以存储任何类型的数据。序列化是将数据结构或对象转换为二进制数据的过程,反序列化则是将二进制数据转换为原始数据结构或对象的过程。在Hive中,可以使用ROW FORMAT SERDE关键字指定序列化和反序列化的类,例如’org.apache.hadoop.hive.serde2.hadoop_sequencefile_serde’。

优缺点比较

序列文件存储格式的优点包括:

  • 存储效率高,数据量大时能够提高查询性能;
  • 支持数据压缩,存储空间小;
  • 支持数据类型的自动转换,无需手动进行数据类型转换和数据清洗。

序列文件存储格式的缺点包括:

  • 序列化和反序列化过程需要耗费额外的计算资源;
  • 存储数据的可读性较差,不方便数据的查看和编辑;
  • 不支持数据的动态添加和删除。

总之,序列文件存储格式是一种存储效率高、支持数据压缩和数据类型自动转换的格式,适合存储大规模的数据和高性能的查询场景。但是,由于序列化和反序列化过程需要耗费额外的计算资源,不支持动态添加和删除数据,不适合需要频繁修改数据的场景。

AVRO文件(AVRO):

AVRO是一种数据序列化格式,支持快速的数据读写和跨语言的数据交换1。在Hive中,AVRO文件可以存储任何类型的数据,且支持数据压缩和模式演化(Schema Evolution)。

在Hive中,可以使用AVRO文件存储格式,具体实现如下:

CREATE TABLE my_table (
  col1 STRING,
  col2 INT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS AVRO;

上述代码创建了一张名为my_table的表,包含两列数据:col1和col2。AVRO文件存储格式使用AVRO序列化库将数据存储在二进制文件中,支持数据压缩和模式演化(Schema Evolution)

原理解释

AVRO文件存储格式使用AVRO序列化库将数据存储在二进制文件中,支持快速的数据读写和跨语言的数据交换。AVRO序列化库支持数据压缩和模式演化,即在数据结构发生变化时,能够自动适应新的数据结构。在Hive中,可以使用ROW FORMAT SERDE关键字指定AVRO序列化和反序列化的类,例如’org.apache.hadoop.hive.serde2.avro.AvroSerDe’。

优缺点比较

AVRO文件存储格式的优点包括:

  • 存储效率高,支持数据压缩,存储空间小;
  • 支持数据类型的自动转换和模式演化,无需手动进行数据类型转换和数据清洗,适合处理结构复杂的数据;
  • 支持跨语言的数据交换,方便实现不同系统之间的数据共享。

AVRO文件存储格式的缺点包括:

  • 序列化和反序列化过程需要耗费额外的计算资源;
  • 存储数据的可读性较差,不方便数据的查看和编辑;
  • 不支持数据的动态添加和删除。

总之,AVRO文件存储格式是一种存储效率高、支持数据压缩和数据类型自动转换的格式,适合存储大规模的数据和处理结构复杂的数据。但是,由于序列化和反序列化过程需要耗费额外的计算资源,不支持动态添加和删除数据,不适合需要频繁修改数据的场景。

列式存储(Columnar Storage):

列式存储是一种基于列的存储方式,将同一列的数据存储在一起,可以提高查询效率和压缩比。在Hive中,列式存储可以使用ORC(Optimized Row Columnar)和Parquet等格式来实现。

Hive使用Apache ORC(Optimized Row Columnar)文件格式来存储和查询数据。ORC文件格式使用列式存储,并且可以压缩和索引列数据。Hive提供了一个ORC SerDe(序列化/反序列化)库,用于将数据加载到ORC文件中,并且可以使用SELECT语句查询ORC文件中的数据。

CREATE TABLE my_table (
  id INT,
  name STRING,
  age INT
)
STORED AS ORC;

优点:

  • 查询性能更快:列式存储可以只读取需要的列数据,而不必读取整个行,从而提高查询性能。
  • 更高的压缩比率:由于每个列的数据通常具有更高的数据重复性,可以更好地利用压缩算法,使得列式存储可以使用更高效的压缩算法,从而减少存储空间。
  • 更适合数据仓库:数据仓库通常需要进行复杂的分析查询,列式存储可以更好地满足这种需求。

缺点:

  • 更新数据较慢:由于每个列存储为一个单独的文件,因此更新数据需要更新多个文件,这会比行式存储更慢。
  • 不适合事务处理:列式存储不支持事务处理,因此不适合需要频繁更新数据的应用程序。

综上所述,Hive的列式存储适合用于数据仓库等需要进行复杂分析查询的应用场景,但不适合用于需要频繁更新数据的应用场景。

原理

列式存储将每个列存储为一个单独的文件,并且每个文件中只包含该列的数据。这使得查询可以只读取需要的列数据,而不必读取整个行,从而提高查询性能。此外,列式存储可以使用更高效的压缩算法,因为每个列的数据通常具有更高的数据重复性,可以更好地利用压缩算法。

压缩格式(Compression Format):

Hive支持多种压缩格式,例如Gzip、Snappy、LZO等,可以在数据存储时对数据进行压缩,节省存储空间并提高I/O性能。

CREATE TABLE my_table (
  id INT,
  name STRING,
  age INT
)
STORED AS TEXTFILE
LOCATION '/path/to/my_table'
TBLPROPERTIES ('compression.type'='gzip');

Hive支持多种压缩格式,包括LZO、Gzip、Snappy、Bzip2和Deflate等。这些压缩格式都可以通过在Hive中设置属性来启用。例如,以下代码将启用Snappy压缩格式:

SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

查询语句

压缩格式可以在Hive查询语句中使用,以减少数据传输和存储成本。例如,以下查询语句将在读取数据时使用Snappy压缩格式:

SET hive.exec.compress.input=true;
SET mapred.input.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SELECT * FROM table;

原理

压缩格式通过使用压缩算法来减少数据存储和传输的成本。压缩格式可以在写入数据时进行压缩,在读取数据时进行解压缩。压缩算法可以使用多种不同的方法,例如基于哈夫曼编码的LZO和基于熵编码的Gzip等。不同的压缩算法具有不同的压缩速度和压缩比率。

优缺点

优点:

  • 减少存储和传输成本:压缩格式可以减少数据存储和传输的成本,从而降低了数据仓库的总成本。
  • 提高查询性能:压缩格式可以减少数据传输的大小,从而提高查询性能。

缺点:

  • 压缩和解压缩需要时间:压缩和解压缩需要一定的时间,这可能会影响查询性能。
  • 不同的压缩格式具有不同的优缺点:不同的压缩格式具有不同的压缩速度和压缩比率,选择合适的压缩格式需要根据具体的应用场景进行权衡。

综上所述,Hive的压缩格式可以减少数据存储和传输的成本,但需要权衡压缩速度和压缩比率,以选择合适的压缩格式。

总结

存储格式

概念

区别

使用场景

优点

缺点

建表语句

磁盘空间

查询效率

存储效率

文本文件(TEXTFILE)

将数据存储为文本格式

适合存储小数据量、可读性要求高的场景

易于使用、可读性强

存储格式简单

读取速度较慢、不适合存储海量数据

CREATE TABLE my_table (id INT, name STRING, age INT) STORED AS TEXTFILE;

较大,每行数据都以文本形式存储

读取速度较慢

存储效率低

序列文件(SEQUENCEFILE)

将数据存储为二进制格式

适合存储大数据量、对可读性要求不高的场景

读取速度快、易于存储大数据量

存储格式紧凑、可压缩

不支持单独读取某一列

CREATE TABLE my_table (id INT, name STRING, age INT) STORED AS SEQUENCEFILE;

较小,每行数据以二进制形式存储

读取速度快

存储效率高

AVRO文件(AVRO)

将数据存储为二进制格式,同时提供了数据结构和编码的规范

适合存储大数据量,需要较高数据结构描述性的场景

支持数据结构描述,可压缩、可扩展

存储格式紧凑、支持数据结构描述

不支持单独读取某一列

CREATE TABLE my_table (id INT, name STRING, age INT) STORED AS AVRO;

较小,每行数据以二进制形式存储

读取速度快

存储效率高

列式存储(ORC)

将每个列存储为一个单独的文件,适合用于数据仓库等需要进行复杂分析查询的场景

适合存储大数据量,需要复杂分析查询的场景

支持只读取需要的列数据、查询速度快

查询速度快、可压缩

不支持事务处理、更新数据较慢

CREATE TABLE my_table (id INT, name STRING, age INT) STORED AS ORC;

较小,每个列存储为一个单独的文件,可压缩

查询速度快

存储效率高

压缩格式

使用压缩算法来减少数据存储和传输的成本

适合存储大数据量,需要降低存储和传输成本的场景

减少存储和传输成本

压缩比高

压缩和解压缩需要时间

CREATE TABLE my_table (id INT, name STRING, age INT) STORED AS TEXTFILE LOCATION ‘/path/to/my_table’ TBLPROPERTIES (‘compression.type’=‘gzip’);

较小,压缩比高

查询速度较慢

存储效率高

总体来说,不同存储格式适用于不同的场景,需要根据具体的需求进行选择。例如,对于需要进行复杂分析查询的数据仓库,可以选择列式存储(ORC)来提高查询效率;对于需要降低存储和传输成本的场景,可以选择压缩格式来减少数据存储和传输的成本。在选择存储格式时,还需要权衡不同存储格式的优缺点,以选择最适合自己的存储格式。


  1. 当使用 Avro 进行跨语言数据交换时,它的数据结构和模式信息会被序列化为一种紧凑的二进制格式,这使得数据的传输和存储变得更加高效。这种紧凑的二进制格式还可以在不同语言之间进行快速的数据读写,从而实现跨语言的数据交换。例如,假设我们有一个使用 Java 编写的应用程序,它需要将数据传输给一个使用 Python 编写的应用程序。如果我们使用传统的文本格式进行数据交换,那么需要进行繁琐的编解码操作,并且由于文本格式存在冗余信息,会导致数据传输和存储的效率低下。但是如果我们使用 Avro 进行数据交换,我们可以将数据结构和模式信息序列化为一种紧凑的二进制格式,这可以使数据传输和存储变得更加高效。此外,由于 Avro 支持多种编程语言,因此我们可以轻松地在 Java 和 Python 之间进行数据交换,而无需进行繁琐的编解码操作。这就是 Avro 支持快速的数据读写和跨语言的数据交换的一个例子。 ↩︎