ORC 文件
Apache ORC 是一种列式格式,具有更高级的功能,如原生 zstd 压缩、布隆过滤器和列式加密。
ORC 实现
Spark 支持两种 ORC 实现 (
native
和
hive
),由
spark.sql.orc.impl
控制。这两种实现共享大部分功能,但设计目标不同。
-
native实现旨在遵循 Spark 的数据源行为,如Parquet。 -
hive实现旨在遵循 Hive 的行为并使用 Hive SerDe。
例如,历史上,
native
实现使用 Spark 的原生
String
处理
CHAR/VARCHAR
,而
hive
实现通过 Hive
CHAR/VARCHAR
进行处理。查询结果是不同的。自 Spark 3.1.0 起,
SPARK-33480
通过支持 Spark 端的
CHAR/VARCHAR
消除了这一差异。
向量化读取器
native
实现支持向量化的 ORC 读取器,并且自 Spark 2.3 起成为默认的 ORC 实现。
当
spark.sql.orc.impl
设置为
native
且
spark.sql.orc.enableVectorizedReader
设置为
true
时,向量化读取器用于本地 ORC 表(例如,使用
USING ORC
子句创建的表)。
对于Hive ORC序列化表(例如,使用子句
USING HIVE OPTIONS (fileFormat 'ORC')
创建的表),当
spark.sql.hive.convertMetastoreOrc
也被设置为
true
时,将使用向量化读取器,并默认开启。
模式合并
类似于 Protocol Buffer、Avro 和 Thrift,ORC 也支持模式演化。用户可以从一个简单的模式开始,并根据需要逐渐向模式中添加更多列。通过这种方式,用户最终可能会得到多个具有不同但相互兼容模式的 ORC 文件。ORC 数据源现在能够自动检测这种情况并合并所有这些文件的模式。
由于模式合并是一个相对昂贵的操作,并且在大多数情况下不是必要的,我们默认将其关闭。您可以通过
-
在读取ORC文件时,将数据源选项
mergeSchema设置为true,或者 -
将全局SQL选项
spark.sql.orc.mergeSchema设置为true。
Zstandard
自Spark 3.2以来,您可以在ORC文件中利用Zstandard压缩。 有关好处,请参见 Zstandard 。
创建 表 compressed (
键 STRING,
值 STRING
)
使用 ORC
选项 (
压缩 'zstd'
)
布隆过滤器
您可以控制ORC数据源的布隆过滤器和字典编码。以下ORC示例将为
favorite_color
创建布隆过滤器,并仅使用字典编码。要了解有关额外ORC选项的更多详细信息,请访问官方Apache ORC网站。
CREATE TABLE users_with_options (
name STRING,
favorite_color STRING,
favorite_numbers array<integer>
)
USING ORC
OPTIONS (
orc.bloom.filter.columns 'favorite_color',
orc.dictionary.key.threshold '1.0',
orc.column.encoding.direct 'name'
)
列式加密
自 Spark 3.2 以来,支持对使用 Apache ORC 1.6 的 ORC 表进行列式加密。以下示例使用 Hadoop KMS 作为密钥提供者,并给出了位置。请访问 Apache Hadoop KMS 获取详细信息。
CREATE TABLE encrypted (
ssn STRING,
email STRING,
name STRING
)
USING ORC
OPTIONS (
hadoop.security.key.provider.path "kms://http@localhost:9600/kms",
orc.key.provider "hadoop",
orc.encrypt "pii:ssn,email",
orc.mask "nullify:ssn;sha256:email"
)
Hive元存储ORC表转换
当从 Hive 元存储 ORC 表中读取数据并插入到 Hive 元存储 ORC 表时,Spark SQL 将尝试使用其自己的 ORC 支持,而不是 Hive SerDe,以获得更好的性能。对于 CTAS 语句,只有非分区的 Hive 元存储 ORC 表会被转换。这个行为由
spark.sql.hive.convertMetastoreOrc
配置控制,默认情况下是开启的。
配置
| 属性名称 | 默认 | 含义 | 自版本 |
|---|---|---|---|
spark.sql.orc.impl
|
native
|
ORC 实现的名称。它可以是
native
或
hive
之一。
native
表示原生 ORC 支持。
hive
表示 Hive 中的 ORC 库。
|
2.3.0 |
spark.sql.orc.enableVectorizedReader
|
true
|
在
native
实现中启用矢量化 ORC 解码。如果
false
,
则在
native
实现中使用新的非矢量化 ORC 读取器。
对于
hive
实现,此设置将被忽略。
|
2.3.0 |
spark.sql.orc.columnarReaderBatchSize
|
4096
|
在 ORC 矢量化读取器批处理中包含的行数。该数量应仔细选择,以最小化开销并避免读取数据时出现 OOM。 | 2.4.0 |
spark.sql.orc.columnarWriterBatchSize
|
1024
|
在 ORC 矢量化写入器批处理中包含的行数。该数量应仔细选择,以最小化开销并避免写入数据时出现 OOM。 | 3.4.0 |
spark.sql.orc.enableNestedColumnVectorizedReader
|
true
|
在
native
实现中为嵌套数据类型(数组、映射和结构)启用矢量化 ORC 解码。
如果
spark.sql.orc.enableVectorizedReader
设置为
false
,则此设置将被忽略。
|
3.2.0 |
spark.sql.orc.filterPushdown
|
true
|
当为 true 时,启用 ORC 文件的过滤器下推。 | 1.4.0 |
spark.sql.orc.aggregatePushdown
|
false
|
如果为 true,则聚合将被下推到 ORC 进行优化。支持 MIN、MAX 和 COUNT 作为聚合表达式。对于 MIN/MAX,支持布尔型、整数型、浮点型和日期型。 对于 COUNT,支持所有数据类型。如果任何 ORC 文件尾部缺少统计信息,将抛出异常。 | 3.3.0 |
spark.sql.orc.mergeSchema
|
false |
当为 true 时,ORC 数据源将合并从所有数据文件收集的模式, 否则模式将从随机数据文件中选取。 |
3.0.0 |
spark.sql.hive.convertMetastoreOrc
|
true | 当设置为 false 时,Spark SQL 将使用 Hive SerDe 处理 ORC 表,而不是内置支持。 | 2.0.0 |
数据源选项
ORC的数据源选项可以通过以下方式设置:
-
the
.option/.options方法-
DataFrameReader -
DataFrameWriter -
DataStreamReader -
DataStreamWriter
-
-
OPTIONS子句在 CREATE TABLE USING DATA_SOURCE
| 属性名称 | 默认值 | 含义 | 范围 |
|---|---|---|---|
mergeSchema
|
false
|
设置是否应合并从所有ORC部分文件收集的模式。这将覆盖
spark.sql.orc.mergeSchema
。默认值在
spark.sql.orc.mergeSchema
中指定。
|
读取 |
compression
|
snappy
|
保存到文件时使用的压缩编码。这可以是已知的不区分大小写的简短名称之一(none, snappy, zlib, lzo, zstd和lz4)。这将覆盖
orc.compress
和
spark.sql.orc.compression.codec
。
|
写入 |
其他通用选项可以在 通用文件源选项 中找到。