Hive官方使用手册——ORC

本文为自己翻译的译文,原文地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC


ORC File Format

Version

Introduced in Hive version 0.11.0.

Optimized Row Columnar(ORC)文件格式提供了存储Hive数据的高效方法。它的设计是为了克服其他Hive文件格式的限制。使用ORC文件可以提高Hive在读取、写入和处理数据时的性能。

与RCFile格式相比,ORC文件格式有很多优点:

  • 单个文件作为每个任务的输出,它减少了NameNode的负载。
  • Hive类型支持,包括datetime、decimal和复杂类型(struct、list、map和union)
  • 在文件中存储轻量级索引
    • 跳过不通过谓词过滤的行组
    • 寻找一个给定的行
  • 基于数据类型的块模式压缩
    • 整数列的运行长度编码
    • 对字符串列的字典编码
  • 使用单独的记录阅读器并发读取相同的文件
  • 能够不扫描标记分割文件
  • 限制读写所需的内存
  • 使用协议缓冲区存储的元数据,允许添加和删除字段

文件结构

ORC文件包含称为stripes的行数据组,以及文件页脚中的辅助信息。在文件的末尾,一个postscript 保存了压缩参数和压缩页脚的大小。

默认的脚本大小为250MB。大的stripes可以大块的高效的从HDFS上读取。

文件页脚包含文件中的stripes 列表、每个stripes 的行数和每列的数据类型。它还包含列级的聚合计数、最小值、最大值和总和。

该图说明了ORC文件结构:

Stripe 结构

如上图所示,ORC文件中的每个strip都包含Index dataRow data和一个stripe footer

stripe footer包含一个流位置目录。Row data用于表扫描。

Index data包括每个列的最小值和最大值,以及每个列中的行位置。(还可能包含一些字段或bloom过滤器。) 行索引项提供了偏移量可以找到正确的压缩块和在解压缩块后的字节。注意,ORC索引仅用于选择stripe footerRow data,而不用于相应查询。

针对相对频繁的行索引使用,允许使用stripe可以进行多行跳过操作,从而实现快速读取,尽管有较大的条带大小。默认情况下,可以跳过10,000行。

由于基于谓词的筛选能够跳过大量行集,对一个表您可以在其第二主键上进行排序,从而大大减少执行时间。例如,如果主分区是事务日期,则可以根据状态、编码和姓氏对表进行排序。然后一次记录查找将跳过所有其他查询的记录。 

ORC规范中给出了格式的完整规范。

HiveQL 语法

File formats are specified at the table (or partition) level. 在表(或分区)级别指定文件格式。你可以使用HiveQL语句像这样指定ORC文件格式:

  • CREATE TABLE ... STORED AS ORC
  • ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
  • SET hive.default.fileformat=Orc

TBLPROPERTIES里有所有参数(参见Create Table)中。他们是:

关键字

默认值

注释

orc.compress

ZLIB

高度压缩 (one of NONE, ZLIB, SNAPPY)

orc.compress.size

262,144

每个压缩块中的字节数。

orc.stripe.size

67,108,864

每个stripe块中的字节数。

orc.row.index.stride

10,000

索引项之间的行数 (must be >= 1000)

orc.create.index

true

是否创建行索引

orc.bloom.filter.columns "" 逗号分隔的列名列表,用于创建bloom过滤器。
orc.bloom.filter.fpp 0.05 布隆过滤器的假阳性概率。 (must >0.0 and <1.0)

例如,创建一个没有压缩的ORC存储表:

create table Addresses (
  name string,
  street string,
  city string,
  state string,
  zip int
) stored as orc tblproperties ("orc.compress"="NONE");

Version 0.14.0+: CONCATENATE

ALTER TABLE table_name [PARTITION partition_spec] CONCATENATE can be used to merge small ORC files into a larger file, starting in Hive 0.14.0. The merge happens at the stripe level, which avoids decompressing and decoding the data.

序列化和压缩

ORC文件中的列数据的序列化取决于数据类型是整数还是字符串。

整数列序列化

整数列在两个流中序列化。

  1. 当前位流:值非空吗?
  2. 数据流:一个整数流。

整数数据的序列化方式利用了数字的共同分布:

  • 整数使用可变宽度编码进行编码,这样小整数的字节使用更少。
  • 重复的值使用运行时长度进行编码。
  • 与一个常数的差值在范围(-128到127)内则使用运行时长度编码。

可变宽度编码是基于谷歌的协议缓冲区并使用高位来表示这个字节不是最后一个和较低的7位编码数据。为了编码负数,使用zigzag编码把0、-1、1、-2和2映射到0、1、2、3、4和5。

每组数字都是这样编码的:

  • 如果第一个字节(b0)为负熟:
    • 后面跟着-b0个可变长度的整数。
  • 如果第一个字节(b0)为正数:
    • 它表示b0 + 3重复的整数。
    • 在每次重复数之间增加第二个字节(在-128到+127)。
    • 一个可变长度的正数

在运行时长度编码中,第一个字节表示运行时长度和是否值为文字或重复值。重复的值是在-128之间+128。运行时长度编码使用protobuf 样式可变长度的整数。

序列化字符串列

字符串列的序列化使用字典来形成惟一的列值。字典被排序以加快谓词过滤和提高压缩比。

字符串列在四个流中序列化。

  1. 当前位流:值非空吗?
  2. 字典数据:字符串的字节。
  3. 字典长度:每个条目的长度。
  4. 行数据:行值。

字典长度和行值都是运行长度编码的整数流。

压缩

流使用一个编解码器进行压缩的,编解码器被指定为该表中所有流的表属性。为了优化内存使用,在生成每个块时会进行增量地压缩。 压缩块可以跳过而无需先解压缩再进行扫描。流中的位置由块的开始位置和块中的偏移量决定。

编解码器可以是Snappy, Zlib, or none。

ORC File转储工具

ORC文件转储工具分析ORC文件。要调用它,请使用以下命令:

// Hive version 0.11 through 0.14:
hive --orcfiledump <location-of-orc-file>
 
// Hive version 1.1.0 and later:
hive --orcfiledump [-d] [--rowindex <col_ids>] <location-of-orc-file>
 
// Hive version 1.2.0 and later:
hive --orcfiledump [-d] [-t] [--rowindex <col_ids>] <location-of-orc-file>
 
// Hive version 1.3.0 and later:
hive --orcfiledump [-j] [-p] [-d] [-t] [--rowindex <col_ids>] [--recover] [--skip-dump] 
     [--backup-path < new -path>] <location-of-orc-file-or-directory>

在该命令中使用-d ,将导致它转储ORC文件数据而不是元数据(Hive 1.1.0和更高版本)。

使用--rowindex 指定逗号来分隔列id的列表将会打印指定列的行索引,其中0是包含所有列的顶层结构,1是第一列id(Hive 1.1.0 及更高版本支持).

在命令中使用 -t 将打印出写入器的时区id。

在命令中使用 -j 将以JSON格式打印ORC文件元数据。为了更好地打印JSON元数据,可以添加 -p 到命令中。

在命令中使用 --recover 将恢复由Hive流生成的损坏的ORC文件。

在命令中将 --skip-dump 和 --recover 一起使用将在不转储元数据的情况下执行恢复。

在命令中使用 --backup-path 指定一个新的备份路径,恢复工具会将已损坏的文件移动到指定的备份路径(默认:/tmp)。

<location-of-orc-file> 是ORC文件的URI。

<location-of-orc-file-or-directory>是ORC文件或目录的URI。从Hive 1.3.0开始,这个URI可以是一个包含ORC文件的目录。

ORC 配置参数

ORC配置参数在Hive Configuration Properties – ORC File Format有详细描述。

ORC 格式说明文档

ORC 格式说明文档已经移到 ORC project
.


猜你喜欢

转载自blog.csdn.net/maizi1045/article/details/79667857