ORC 文件

Apache ORC 是一种列式格式,具有更高级的功能,如原生 zstd 压缩、布隆过滤器和列式加密。

ORC 实现

Spark 支持两种 ORC 实现 ( native hive ),由 spark.sql.orc.impl 控制。这两种实现共享大部分功能,但设计目标不同。

例如,历史上, 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 数据源现在能够自动检测这种情况并合并所有这些文件的模式。

由于模式合并是一个相对昂贵的操作,并且在大多数情况下不是必要的,我们默认将其关闭。您可以通过

  1. 在读取ORC文件时,将数据源选项 mergeSchema 设置为 true ,或者
  2. 将全局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的数据源选项可以通过以下方式设置:

属性名称 默认值 含义 范围
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 写入

其他通用选项可以在 通用文件源选项 中找到。