语言手册ORC

ORC文件

 

 

ORC文件格式

在Hive版本0.11.0中引入

所述优化行柱状ORC)文件格式提供了存储数据蜂房一种高度有效的方法。它旨在克服其他Hive文件格式的限制。当Hive读取,写入和处理数据时,使用ORC文件可以提高性能。

与RCFile格式相比,ORC文件格式具有许多优点,例如:

  • 一个文件作为每个任务的输出,从而减轻了NameNode的负担
  • 支持Hive类型,包括日期时间,十进制和复杂类型(结构,列表,映射和联合)
  • 存储在文件中的轻量级索引
    • 跳过不通过谓词过滤的行组
    • 寻求给定的行
  • 基于数据类型的块模式压缩
    • 整数列的游程编码
    • 字符串列的字典编码
  • 使用单独的RecordReaders并发读取同一文件
  • 无需扫描标记即可分割文件的功能
  • 限制读取或写入所需的内存量
  • 使用协议缓冲区存储的元数据,允许添加和删除字段

档案结构

ORC文件包含称为条纹的行数据组,以及文件页脚中的辅助信息。在文件的末尾,附言包含压缩参数和压缩后的页脚大小。

默认条带大小为250 MB。大条带大小可实现从HDFS进行大而有效的读取。

文件页脚包含文件中的条带列表,每个条带的行数以及每一列的数据类型。它还包含列级聚合计数,最小,最大和总和。

下图说明了ORC文件结构:

语言手册ORC

条纹结构

如图所示,ORC文件中的每个条带均包含索引数据,行数据和条带脚注。

条纹页脚包含流位置的目录。行数据用于表扫描。

索引数据包括每列的最小值和最大值以及每列中的行位置。(也可以包括位字段或Bloom过滤器。)行索引条目提供偏移量,这些偏移量使能够在压缩块内寻找正确的压缩块和字节。请注意,ORC索引仅用于选择条纹和行组,而不用于回答查询。

尽管条带尺寸较大,但具有相对频繁的行索引条目可以在条带内跳过行以快速读取。默认情况下,每10,000行可以跳过。

具有基于过滤谓词跳过大行集的功能,您可以在其辅助键上对表进行排序,从而大大减少了执行时间。例如,如果主分区是交易日期,则可以按状态,邮政编码和姓氏对表进行排序。然后在一种状态下查找记录将跳过所有其他状态的记录。

ORC规范中提供了格式的完整规范

HiveQL语法

在表(或分区)级别指定文件格式。您可以使用以下HiveQL语句指定ORC文件格式:

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

所有参数都放置在TBLPROPERTIES中(请参阅创建表)。他们是:

默认

笔记

orc.compress

ZLIB

高级压缩(NONE,ZLIB和SNAPPY之一)

orc.compress.size

262,144

每个压缩块中的字节数

orc.stripe.size

67,108,864

每个条带中的字节数

orc.row.index.stride

10,000

索引条目之间的行数(必须> = 1000)

orc.create.index

真正

是否创建行索引

orc.bloom.filter.columns 逗号分隔的应创建bloom过滤器的列名称列表
orc.bloom.filter.fpp 0.05 布隆过滤器的假正概率(必须> 0.0和<1.0)

例如,创建不压缩的ORC存储表:

创建表地址(
  名称字符串,
  街道字符串,
  城市字符串,
  状态字符串,
  zip int
)存储为orc tblproperties(“ orc.compress” =“ NONE”);

版本0.14.0+:CONCATENATE

ALTER TABLE table_name [PARTITION partition_spec] CONCATENATEHive 0.14.0开始,可用于将较小的ORC文件合并为较大的文件。合并发生在条带级别,这避免了对数据进行解压缩和解码。

序列化和压缩

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

整数列序列化

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

  1. 当前比特流:该值是否为非空?
  2. 数据流:整数流

整数数据的序列化利用了数字的常见分布:

  • 整数使用可变宽度编码进行编码,对于小整数,该可变宽度编码具有较少的字节。
  • 重复的值是游程长度编码的。
  • 游程长度编码范围内(-128到127)范围内恒定的值。

所述可变宽度编码是基于谷歌的协议缓冲区,并使用高比特来表示这个字节是否是不是最后的和低7位对数据进行编码。为了对负数进行编码,使用曲折编码,其中0,-1、1,-2和2分别映射为0、1、2、3、4和5。

每组数字的编码方式如下:

  • 如果第一个字节(b0)为负:
    • -b0可变长度整数。
  • 如果第一个字节(b0)为正:
    • 它代表b0 + 3个重复的整数
    • 在每个重复之间添加第二个字节(-128至+127)
    • 1个变长整数。

游程长度编码中,第一个字节指定游程长度以及值是文字还是重复值。重复次数可以从-128到+128。行程编码使用protobuf样式的可变长度整数。

字符串列序列化

字符串列的序列化使用字典来形成唯一的列值。对字典进行排序可加快谓词过滤速度并提高压缩率。

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

  1. 当前比特流:该值是否为非空?
  2. 字典数据:字符串的字节
  3. 字典长度:每个条目的长度
  4. 行数据:行值

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

压缩

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

编解码器可以是Snappy,Zlib或none

ORC文件转储实用程序

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)。

<orc文件的位置>是ORC文件的URI。

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

ORC配置参数

Hive配置属性– ORC文件格式中描述了ORC配置参数。

ORC格式规范

ORC规范已移至  ORC项目