ORC ファイル

Apache ORC は、ネイティブ zstd 圧縮、ブルームフィルター、列暗号化などの高度な機能を持つ列指向フォーマットです。

ORC の実装

Spark は、spark.sql.orc.impl で制御される 2 つの ORC 実装(nativehive)をサポートしています。2 つの実装は、異なる設計目標を持ちながらも、ほとんどの機能を共有しています。

例えば、歴史的に、native 実装は Spark のネイティブ StringCHAR/VARCHAR を処理していましたが、hive 実装は Hive の CHAR/VARCHAR を介して処理していました。クエリ結果は異なります。Spark 3.1.0 以降、SPARK-33480 により、Spark 側から CHAR/VARCHAR をサポートすることで、この違いは解消されました。

Vectorized Reader

native 実装は、ベクトル化された ORC リーダーをサポートしており、Spark 2.3 以降、デフォルトの ORC 実装となっています。ベクトル化されたリーダーは、spark.sql.orc.implnative に設定され、spark.sql.orc.enableVectorizedReadertrue に設定されている場合に、ネイティブ ORC テーブル(例: USING ORC 句を使用して作成されたもの)に使用されます。

Hive ORC serde テーブル(例: USING HIVE OPTIONS (fileFormat 'ORC') 句を使用して作成されたもの)の場合、ベクトル化されたリーダーは spark.sql.hive.convertMetastoreOrctrue に設定されている場合に使用され、デフォルトで有効になっています。

スキーマのマージ

Protocol Buffer、Avro、Thrift と同様に、ORC もスキーマ進化をサポートしています。ユーザーはシンプルなスキーマで開始し、必要に応じて徐々に列を追加していくことができます。このようにして、ユーザーは異なるが相互に互換性のあるスキーマを持つ複数の ORC ファイルを持つことになる場合があります。ORC データソースは、このケースを自動的に検出し、これらのすべてのファイルのスキーマをマージできるようになりました。

スキーマのマージは比較的コストのかかる操作であり、ほとんどの場合必要ではないため、デフォルトでは無効になっています。これを有効にするには、

  1. ORC ファイルを読み取る際にデータソースオプション mergeSchematrue に設定する、または
  2. グローバル SQL オプション spark.sql.orc.mergeSchematrue に設定します。

Zstandard

Spark 3.2 以降、ORC ファイルで Zstandard 圧縮を活用できます。メリットについては Zstandard を参照してください。

CREATE TABLE compressed (
  key STRING,
  value STRING
)
USING ORC
OPTIONS (
  compression 'zstd'
)

Bloom Filters

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

Columnar Encryption

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 はパフォーマンス向上のために Hive SerDe ではなく、独自の ORC サポートを使用しようとします。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.enableVectorizedReaderfalse に設定されている場合、これは無視されます。 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 データソースはすべてのデータファイルから収集されたスキーマをマージします。false の場合、スキーマはランダムなデータファイルから取得されます。

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 で指定された値です。 読み込み
compression zstd ファイルに保存する際に使用する圧縮コーデック。これは、既知の(大文字小文字を区別しない)短縮名(none、snappy、zlib、lzo、zstd、lz4、brotli)のいずれかになります。これは orc.compress および spark.sql.orc.compression.codec を上書きします。brotlibrotli4j がインストールされている必要があることに注意してください。 書き込み

その他の一般的なオプションについては、 Generic File Source Options を参照してください。