ORC 文件

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

ORC 实现

Spark 支持两种 ORC 实现(nativehive),由 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 设置为 nativespark.sql.orc.enableVectorizedReader 设置为 true 时,向量化读取器用于原生 ORC 表(例如,使用子句 USING ORC 创建的表)。

对于 Hive ORC serde 表(例如,使用子句 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

CREATE TABLE compressed (
  key STRING,
  value STRING
)
USING ORC
OPTIONS (
  compression '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 实现的名称。它可以是 nativehive 之一。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 将对 ORC 表使用 Hive SerDe,而不是内置支持。 2.0.0

数据源选项

可以通过以下方式设置 ORC 的数据源选项

属性名称默认值含义范围
mergeSchema false 设置是否应合并从所有 ORC 部分文件中收集的模式。这将覆盖 spark.sql.orc.mergeSchema。默认值在 spark.sql.orc.mergeSchema 中指定。 读取
compression snappy 保存到文件时使用的压缩编解码器。它可以是不区分大小写的已知缩写名称之一(none、snappy、zlib、lzo、zstd 和 lz4)。这将覆盖 orc.compressspark.sql.orc.compression.codec 写入

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