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。
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 文件启用谓词下推(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 |
如果为 |
3.0.0 |
spark.sql.hive.convertMetastoreOrc |
true | 当设置为 false 时,Spark SQL 将对 ORC 表使用 Hive SerDe,而不是内置支持。 |
2.0.0 |
数据源选项
ORC 数据源选项可以通过以下方式设置:
- DataFrameReader 的
.option
/.options
方法DataFrameWriter
DataStreamReader
DataStreamWriter
在 CREATE TABLE USING DATA_SOURCE 中的
OPTIONS
子句
- 范围
属性名称 | 默认值 | 含义 | mergeSchema |
---|---|---|---|
设置是否合并从所有 ORC 分区文件收集到的模式。这将覆盖 |
false |
读取 | compression |
zstd |
保存到文件时使用的压缩编解码器。可以是已知的、不区分大小写的缩写名称之一(none、snappy、zlib、lzo、zstd、lz4 和 brotli)。这将覆盖 |
写入 | 其他通用选项可以在通用文件源选项中找到。 |
其他通用选项可以在 通用文件源选项 中找到。