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 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 文件启用谓词下推(filter pushdown)。 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
设置是否合并从所有 ORC 分区文件收集到的模式。这将覆盖 spark.sql.orc.mergeSchema。默认值在 spark.sql.orc.mergeSchema 中指定。 false 读取 compression
zstd 保存到文件时使用的压缩编解码器。可以是已知的、不区分大小写的缩写名称之一(none、snappy、zlib、lzo、zstd、lz4 和 brotli)。这将覆盖 orc.compressspark.sql.orc.compression.codec。请注意,brotli 需要安装 brotli4j 写入 其他通用选项可以在通用文件源选项中找到。

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