This website requires JavaScript.

Hive不同文件类型的差异[译]

此博文的目的是讨论Apache Hive中可用的不同文件格式。 阅读本博文后,您将清楚地了解Hive中提供的不同文件格式,以及如何以及在何处适当地使用它们。 在我们继续前进之前,我们来讨论Apache Hive。

Apache Hive

Apache Hive是一个开源数据仓库软件,可以方便查询和管理位于分布式存储中的大型数据集。 Hive提供了一种称为HiveQL的语言,它允许用户查询查询数据,与SQL很相似。

与SQL一样,HiveQL仅处理结构化数据。 默认情况下,Hive具有用于将数据存储在数据库。 我们可以配置Hive与MySQL数据库。 如上所述,HiveQL只能处理结构化数据。 数据最终存储在文件中。 有一些特定的文件格式Hive可以处理,如:

  • TEXTFILE
  • SEQUENCEFILE
  • RCFILE
  • ORCFILE

在深入到文件格式的类型之前,首先讨论一个文件格式是什么!

文件格式

文件格式是将信息存储或编码在计算机文件中的一种方式。 在Hive中,它指的是记录如何存储在文件中。 当我们处理结构化数据时,每个记录必须是它自己的结构。 如何在文件中编码记录定义文件格式。这些文件格式主要在数据编码,压缩率,空间使用和磁盘I / O之间有所不同。 Hive不会验证您加载的数据是否与表的模式匹配。 但是,它会验证文件格式是否与表定义匹配。

现在让我们详细讨论文件格式的类型。

文本文件

TEXTFILE格式是Hadoop中使用的熟知的输入/输出格式。 在Hive中,如果我们将表定义为TEXTFILE,它可以加载来自CSV(逗号分隔值)的数据,由Tabs,Spaces和JSON数据分隔。 这意味着每个记录中的字段应该用逗号或空格或制表符分隔,或者它可以是JSON(JavaScript Object Notation)数据。 默认情况下,如果我们使用TEXTFILE格式,那么每一行都被认为是一条记录。

我们可以在Hive中创建一个TEXTFILE格式,如下所示:

create table table_name (schema of the table) row format delimited by ',' | stored as TEXTFILE.

最后,我们需要指定文件格式的类型。 如果我们不指定任何东西,默认为为TEXTFILE格式。 TEXTFILE输入和TEXTFILE输出格式存在Hadoop包中表示如下:

org.apache.hadoop.mapred.TextInputFormat
org.apache.hadoop.mapred.TextOutputFormat

让我们看一个在Hive中何创建TEXTFILE的例子,并将数据加载到表中进行基本的选择操。

创建文本文件

create table olympic(athelete STRING,age INT,country STRING,year STRING,closing STRING,sport STRING,gold INT,silver INT,bronze INT,total INT) row format delimited fields terminated by '\t' stored as textfile;

这里我们创建一个名为“olympic”的表,表的schema如上所述。 上述输入文件中的数据由制表符空格分隔。 如前所述,文件格式在结尾处指定为TEXTFILE。 上面创建的表的schema可以使用describe olympic来检查;

我们可以通过以下语句导入数据:

load data local inpath ‘path of your file’ into table olympic;

如下图所示:

Creating_text_file_loading_data

我们已经成功地将我们的输入文件数据加载到TEXTFILE格式的表中。

现在我们将对数据执行一个基本的SELECT操作,如下所示:

select athelete from olympic;

Select_operation_texxt_file

检索的数据如下图所示:

textfile_result

SEQUENCEFILE

我们知道,当我们Hadoop的性能处理少量的大文件比处理大量的小文件性能要好。 如果文件的大小小于Hadoop中的块大小,我们认为它是一个小文件。 由于这个原因,大量元数据的增加会导致NameNode负荷开销。 为了解决这个问题,序列文件在Hadoop中引入。 序列文件充当存储小文件的容器。

序列文件是由二进制键值对组成的平面文件。 当Hive将查询转换为MapReduce作业时,它会决定要用于给定记录的相应键值对。 这种二进制的序列文件是可以分割的,主要用于合并两个或更多的小文件并使它们成为一个序列文件。

在Hive中,我们可以通过在CREATE TABLE语句结尾处指定STORED AS SEQUENCEFILE来创建序列文件。 有三种类型的序列文件:

  • 未压缩的键/值记录。
  • 记录压缩的键/值记录 - 这里只压缩“值”
  • 块压缩键/值记录 - 键和值都分别在“块”中收集并压缩。 “块”的大小是可配置的。

Hive有自己的SEQUENCEFILE读取器和SEQUENCEFILE写入器,用于读写序列文件。

在Hive中,我们可以通过如下方式创建一个序列文件:

create table table_name (schema of the table) row format delimited by ',' | stored as SEQUENCEFILE

Hive使用以下包中的SEQUENCEFILE输入和输出格式:

org.apache.hadoop.mapred.SequenceFileInputFormat
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

创建序列文件

create table olympic_sequencefile(athelete STRING,age INT,country STRING,year STRING,closing STRING,sport STRING,gold INT,silver INT,bronze INT,total INT) row format delimited fields terminated by '\t' stored as sequencefile

这里我们创建一个名为olympic_sequencefile的表,表的schema如上所述,输入文件中的数据由制表符分隔。 最后,文件格式指定为SEQUENCEFILE格式。 您可以使用以下方法检查已创建表的模式:

describe olympic_sequencefile;

同样如下图所示:

sequence_file_creation

现在加载数据到这个表与加载到使用TEXTFILE格式创建的表有些不同。 您需要从另一个表插入数据,因为该SEQUENCEFILE格式是二进制格式。 它压缩数据,然后将其存储到表中。 如果你想要像TEXTFILE格式一样直接加载,这是不可能的,因为我们不能将压缩文件(这里的解释我感觉好奇怪,不知道是不是我理解错误)插入表。

所以要将数据加载到SEQUENCEFILE中,我们需要使用以下方法:

INSERT OVERWRITE TABLE olympic_sequencefile
SELECT * FROM olympic;

我们已经创建了一个名为olympic的表,它是TEXTFILE格式,然后我们将奥林匹克表的内容写入olympic sequencefile表中。

Loading_data_sequence_file

现在让我们执行相同的SELECT操作

select athelete from olympic_sequencefile;

Select_operation_sequence_file

结果如下:

sequence_file_result

RCFILE

RCFILE是列存储文件,它是另一种类型的二进制文件格式,在顶部行提供高压缩率。 当我们想要一次对多行执行操作时,使用RCFILE。 RCFILE是由二进制key/value对组成的平面文件,与SEQUENCEFILE有很多相似之处。 RCFILE以列的方式存储记录。它首先将行水平分割,然后将每个行以列形方式垂直分割。 RCFILE首先存储行拆分的元数据,作为记录的key部分,并将行的所有数据拆分为值部分。这意味着RCFILE鼓励面向列的存储而不是面向行的存储。 面向列的存储在执行分析时非常有用。当我们有面向列的存储类型时,很容易执行分析。 Facebook使用RCFILE作为其数据存储在其数据仓库中的默认文件格式,他们使用Hive执行不同类型的分析。

在Hive中,我们可以创建一个如下格式的RCFILE

create table table_name (schema of the table) row format delimited by ',' | stored as RCFILE

Hive在其默认包中有自己的RCFILE输入格式和RCFILE输出格式:

org.apache.hadoop.hive.ql.io.RCFileInputFormat
org.apache.hadoop.hive.ql.io.RCFileOutputFormat

创建RCFILE

create table olympic_rcfile(athelete STRING,age INT,country STRING,year STRING,closing STRING,sport STRING,gold INT,silver INT,bronze INT,total INT) row format delimited fields terminated by '\t' stored as rcfile

这里我们创建一个名为olympic_rcfile的表,表的模式如上所述。文件中的数据由制表符空格分隔。语句的最后制定rcfile为存储格式。可以通过以下语句查看schema

 describe olympic_rcfile;

我们不能直接加载数据到RCFILE。首先,我们需要将数据加载到另一个表中,然后我们需要将其覆盖到我们新创建的RCFILE中,如下所示:

INSERT OVERWRITE TABLE olympic_rcfile
SELECT * FROM olympic;

我们已经创建了名为olympic的表,它是TEXTFILE格式的,然后我们将olympic表的内容写入olympic_rcfile表,如下图所示:

rc_file_creation_loading_data

如上所示,我们已经成功地将数据加载到RCFILE中。

现在让我们执行相同的SELECT操作

select athelete from olympic_rcfile;

select_operation_rc_file

结果如下:

rcfile_result

ORCFILE

ORC即Optimized Row Columnar,这意味着它可以以比其他文件格式更优的方式存储数据。 ORC将原始数据的大小减小到75%。数据处理的速度也增加。 ORC比文本,序列和RC文件格式有着更好的性能。 ORC文件在文件页脚包含称为条带行数据组。 ORC格式提高了Hive处理数据时的性能。

我们可以通过以下语句创建了RCFILE

create table table_name (schema of the table) row format delimited by ',' | stored as ORC

Hive ORCFile 输入输出格式的包为:

org.apache.hadoop.hive.ql.io.orc

创建ORCFILE

create table olympic_orcfile(athelete STRING,age INT,country STRING,year STRING,closing STRING,sport STRING,gold INT,silver INT,bronze INT,total INT) row format delimited fields terminated by '\t' stored as orcfile;

这里我们创建一个名为olympic_orcfile的表,表的Schema如上所述。输入文件中的数据由制表符空格分隔。 最后,文件格式指定为ORCFILE格式。 您可以使用以下方法检查创建的表的模式:

describe olympic_orcfile;

我们不能直接将数据加载到ORCFILE。首先,我们需要将数据加载到另一个表中,然后我们需要将其覆盖到我们新创建的ORCFILE中。

INSERT OVERWRITE TABLE olympic_orcfile
SELECT * FROM olympic;

下面是一个由名称olympic创建的表格,它是TEXTFILE格式的,然后我们需要将olympic表的内容写入olympic_orcfile表。

orc_file_creation_loading_data

我们已经成功地将数据加载到ORCFILE中。 现在让我们执行我们对TEXTFILE格式执行的相同的基本SELECT操作.

select athelete from olympic_orcfile;

select_operation_orc_file

结果如下:

orc_file_result

您可以根据您的数据使用上述四种文件格式。 例如, a) 如果您的数据由一些“参数”分隔,那么您可以使用TEXTFILE格式。 b) 如果你的数据是小文件,其大小小于块大小,那么你可以使用SEQUENCEFILE格式。 c) 如果要对数据执行分析,并且希望有效地存储数据,那么可以使用RCFILE格式。 d) 如果要以优化的方式存储数据,从而减少存储空间并提高性能,则可以使用ORC FILE格式。

希望这篇博文让你有清晰的了解,根据您的数据,在Hive中使用的文件格式。

原文地址 File Formats in Apache HIVE

0条评论
avatar