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 serde 表(例如,使用子句 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。
布隆过滤器
您可以控制 ORC 数据源的布隆过滤器和字典编码。以下 ORC 示例将创建布隆过滤器,并且仅对 favorite_color
使用字典编码。要查找有关额外 ORC 选项的更多详细信息,请访问 Apache ORC 官方网站。
列式加密
从 Spark 3.2 开始,使用 Apache ORC 1.6 支持对 ORC 表进行列式加密。以下示例使用 Hadoop KMS 作为密钥提供程序,并指定了位置。有关详细信息,请访问 Apache Hadoop KMS。
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 将对 ORC 表使用 Hive SerDe,而不是内置支持。 | 2.0.0 |
数据源选项
可以通过以下方式设置 ORC 的数据源选项
.option
/.options
方法DataFrameReader
DataFrameWriter
DataStreamReader
DataStreamWriter
- CREATE TABLE USING DATA_SOURCE 中的
OPTIONS
子句
属性名称 | 默认值 | 含义 | 范围 |
---|---|---|---|
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 。 |
写入 |
其他通用选项可以在 通用文件源选项 中找到。