ORC 檔案

Apache ORC 是一種欄位格式,具有更進階的功能,例如原生 zstd 壓縮、bloom 篩選器和欄位加密。

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 時,會使用向量化讀取器,且預設會開啟。

Schema 合併

與 Protocol Buffer、Avro 和 Thrift 類似,ORC 也支援 schema 演進。使用者可以從簡單的 schema 開始,並視需要逐漸新增更多欄位至 schema。如此一來,使用者可能會得到多個具有不同但相互相容 schema 的 ORC 檔案。ORC 資料來源現在能夠自動偵測此案例,並合併所有這些檔案的 schema。

由於架構合併是一個相對昂貴的運算,而且在多數情況下並非必要,因此我們在預設情況下將其關閉。您可以透過

  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'
)

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 實作的名稱。它可以是 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 檔案啟用過濾器下推。 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 的資料來源選項可透過下列方式設定

屬性名稱預設值意義範圍
mergeSchema false 設定是否要合併從所有 ORC 部分檔案收集的架構。這會覆寫 spark.sql.orc.mergeSchema。預設值指定在 spark.sql.orc.mergeSchema 中。 read
compression snappy 儲存至檔案時要使用的壓縮編解碼器。這可以是已知的其中一個不分大小寫的簡短名稱 (none、snappy、zlib、lzo、zstd 和 lz4)。這會覆寫 orc.compressspark.sql.orc.compression.codec write

其他一般選項可在 一般檔案來源選項 中找到。