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
时,将使用向量化的读取器,并且默认情况下启用。
Schema 合并
与 Protocol Buffer、Avro 和 Thrift 一样,ORC 也支持 schema 演化。 用户可以从一个简单的 schema 开始,并根据需要逐渐向 schema 添加更多列。 这样,用户最终可能会得到多个具有不同但相互兼容的 schema 的 ORC 文件。 ORC 数据源现在能够自动检测到这种情况并合并所有这些文件的 schema。
由于 schema 合并是一项相对昂贵的操作,并且在大多数情况下不是必需的,因此我们默认将其关闭。 您可以通过以下方式启用它:
- 读取 ORC 文件时,将数据源选项
mergeSchema
设置为true
,或者 - 将全局 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 实现的名称。 它可以是 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,支持 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 的数据源选项
.option
/.options
方法DataFrameReader
DataFrameWriter
DataStreamReader
DataStreamWriter
- CREATE TABLE USING DATA_SOURCE 中的
OPTIONS
子句
属性名称 | 默认值 | 含义 | 范围 |
---|---|---|---|
mergeSchema |
false |
设置是否应合并从所有 ORC 分区文件收集的 schema。 这将覆盖 spark.sql.orc.mergeSchema 。 默认值在 spark.sql.orc.mergeSchema 中指定。 |
读取 |
压缩 |
snappy |
保存到文件时要使用的压缩编解码器。 这可以是已知的不区分大小写的缩短名称(none、snappy、zlib、lzo、zstd 和 lz4)之一。 这将覆盖 orc.compress 和 spark.sql.orc.compression.codec 。 |
写入 |
其他通用选项可以在 通用文件源选项 中找到。