语言手册ORC
ORC文件
ORC文件格式
版
在Hive版本0.11.0中引入。
所述优化行柱状(ORC)文件格式提供了存储数据蜂房一种高度有效的方法。它旨在克服其他Hive文件格式的限制。当Hive读取,写入和处理数据时,使用ORC文件可以提高性能。
与RCFile格式相比,ORC文件格式具有许多优点,例如:
- 一个文件作为每个任务的输出,从而减轻了NameNode的负担
- 支持Hive类型,包括日期时间,十进制和复杂类型(结构,列表,映射和联合)
- 存储在文件中的轻量级索引
- 跳过不通过谓词过滤的行组
- 寻求给定的行
- 基于数据类型的块模式压缩
- 整数列的游程编码
- 字符串列的字典编码
- 使用单独的RecordReaders并发读取同一文件
- 无需扫描标记即可分割文件的功能
- 限制读取或写入所需的内存量
- 使用协议缓冲区存储的元数据,允许添加和删除字段
档案结构
ORC文件包含称为条纹的行数据组,以及文件页脚中的辅助信息。在文件的末尾,附言包含压缩参数和压缩后的页脚大小。
默认条带大小为250 MB。大条带大小可实现从HDFS进行大而有效的读取。
文件页脚包含文件中的条带列表,每个条带的行数以及每一列的数据类型。它还包含列级聚合计数,最小,最大和总和。
下图说明了ORC文件结构:
条纹结构
如图所示,ORC文件中的每个条带均包含索引数据,行数据和条带脚注。
该条纹页脚包含流位置的目录。行数据用于表扫描。
索引数据包括每列的最小值和最大值以及每列中的行位置。(也可以包括位字段或Bloom过滤器。)行索引条目提供偏移量,这些偏移量使能够在压缩块内寻找正确的压缩块和字节。请注意,ORC索引仅用于选择条纹和行组,而不用于回答查询。
尽管条带尺寸较大,但具有相对频繁的行索引条目可以在条带内跳过行以快速读取。默认情况下,每10,000行可以跳过。
具有基于过滤谓词跳过大行集的功能,您可以在其辅助键上对表进行排序,从而大大减少了执行时间。例如,如果主分区是交易日期,则可以按状态,邮政编码和姓氏对表进行排序。然后在一种状态下查找记录将跳过所有其他状态的记录。
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] CONCATENATE
从Hive 0.14.0开始,可用于将较小的ORC文件合并为较大的文件。合并发生在条带级别,这避免了对数据进行解压缩和解码。
序列化和压缩
ORC文件中列数据的序列化取决于数据类型是整数还是字符串。
整数列序列化
整数列在两个流中序列化。
- 当前比特流:该值是否为非空?
- 数据流:整数流
整数数据的序列化利用了数字的常见分布:
- 整数使用可变宽度编码进行编码,对于小整数,该可变宽度编码具有较少的字节。
- 重复的值是游程长度编码的。
- 游程长度编码范围内(-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样式的可变长度整数。
字符串列序列化
字符串列的序列化使用字典来形成唯一的列值。对字典进行排序可加快谓词过滤速度并提高压缩率。
字符串列在四个流中序列化。
- 当前比特流:该值是否为非空?
- 字典数据:字符串的字节
- 字典长度:每个条目的长度
- 行数据:行值
字典长度和行值都是整数的游程长度编码流。
压缩
使用编解码器压缩流,该编解码器被指定为该表中所有流的表属性。为了优化内存使用,在生成每个块时,将逐步进行压缩。压缩块可以跳过,而无需先进行解压缩以进行扫描。流中的位置由块的起始位置和块中的偏移量表示。
编解码器可以是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项目。