ORC 檔案
Apache ORC 是一種欄位格式,具有更進階的功能,例如原生 zstd 壓縮、bloom 篩選器和欄位加密。
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。
由於架構合併是一個相對昂貴的運算,而且在多數情況下並非必要,因此我們在預設情況下將其關閉。您可以透過
- 在讀取 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'
)
Bloom 篩選器
您可以控制 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 起,ORC 表格支援使用 Apache ORC 1.6 進行欄位加密。以下範例使用 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,支援布林、整數、浮點數和日期類型。對於 COUNT,支援所有資料類型。如果任何 ORC 檔案尾端缺少統計資料,則會擲回例外狀況。 | 3.3.0 |
spark.sql.orc.mergeSchema |
false |
當為 true 時,ORC 資料來源會合併從所有資料檔案收集的架構,否則會從隨機資料檔案擷取架構。 |
3.0.0 |
spark.sql.hive.convertMetastoreOrc |
true | 當設為 false 時,Spark SQL 會使用 Hive SerDe 處理 ORC 表格,而不是使用內建支援。 | 2.0.0 |
資料來源選項
ORC 的資料來源選項可透過下列方式設定
- DataFrameReader
DataFrameWriter
DataStreamReader
DataStreamWriter
的
.option
/.options
方法
- 使用資料來源建立表格 中的
OPTIONS
子句
屬性名稱 | 預設值 | 意義 | 範圍 |
---|---|---|---|
mergeSchema |
false |
設定是否要合併從所有 ORC 部分檔案收集的架構。這會覆寫 spark.sql.orc.mergeSchema 。預設值指定在 spark.sql.orc.mergeSchema 中。 |
read |
compression |
snappy |
儲存至檔案時要使用的壓縮編解碼器。這可以是已知的其中一個不分大小寫的簡短名稱 (none、snappy、zlib、lzo、zstd 和 lz4)。這會覆寫 orc.compress 和 spark.sql.orc.compression.codec 。 |
write |
其他一般選項可在 一般檔案來源選項 中找到。