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 设置为 native 并且 spark.sql.orc.enableVectorizedReader 设置为 true 时,向量化的读取器用于原生 ORC 表(例如,使用 USING ORC 子句创建的表)。

对于 Hive ORC serde 表(例如,使用子句 USING HIVE OPTIONS (fileFormat 'ORC') 创建的表),当 spark.sql.hive.convertMetastoreOrc 也设置为 true 时,将使用向量化的读取器,并且默认情况下启用。

Schema 合并

与 Protocol Buffer、Avro 和 Thrift 一样,ORC 也支持 schema 演化。 用户可以从一个简单的 schema 开始,并根据需要逐渐向 schema 添加更多列。 这样,用户最终可能会得到多个具有不同但相互兼容的 schema 的 ORC 文件。 ORC 数据源现在能够自动检测到这种情况并合并所有这些文件的 schema。

由于 schema 合并是一项相对昂贵的操作,并且在大多数情况下不是必需的,因此我们默认将其关闭。 您可以通过以下方式启用它:

  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 metastore ORC 表转换

当从 Hive metastore ORC 表读取并插入到 Hive metastore ORC 表时,Spark SQL 将尝试使用其自己的 ORC 支持而不是 Hive SerDe,以获得更好的性能。 对于 CTAS 语句,仅转换非分区的 Hive metastore 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,支持 boolean、integer、float 和 date 类型。 对于 COUNT,支持所有数据类型。 如果任何 ORC 文件页脚中缺少统计信息,则会引发异常。 3.3.0
spark.sql.orc.mergeSchema false

如果为 true,则 ORC 数据源会合并从所有数据文件收集的 schema,否则,将从随机数据文件中选择 schema。

3.0.0
spark.sql.hive.convertMetastoreOrc true 如果设置为 false,则 Spark SQL 将使用 Hive SerDe 来处理 ORC 表,而不是内置支持。 2.0.0

数据源选项

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

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

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