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をサポートすることで、この違いを解消します。

ベクトル化されたリーダー

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

ブルームフィルター

ORCデータソースのブルームフィルターと辞書エンコーディングを制御できます。次のORCの例では、ブルームフィルターを作成し、favorite_colorのみに辞書エンコーディングを使用します。追加のORCオプションの詳細については、公式のApache ORCのWebサイトをご覧ください。

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メタストアORCテーブルの変換

HiveメタストアORCテーブルから読み取り、HiveメタストアORCテーブルに挿入する場合、Spark SQLはパフォーマンス向上のために、Hive SerDeの代わりに独自のORCサポートを使用しようとします。CTASステートメントの場合、パーティション化されていないHiveメタストア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データソースはすべてのデータファイルから収集されたスキーマをマージします。それ以外の場合、スキーマはランダムなデータファイルから選択されます。

3.0.0
spark.sql.hive.convertMetastoreOrc true falseに設定すると、Spark SQLは組み込みのサポートの代わりに、ORCテーブルにHive SerDeを使用します。 2.0.0

データソースオプション

ORCのデータソースオプションは、次のように設定できます。

プロパティ名デフォルト意味スコープ
mergeSchema false すべてのORCパートファイルから収集されたスキーマをマージするかどうかを設定します。これはspark.sql.orc.mergeSchemaを上書きします。デフォルト値はspark.sql.orc.mergeSchemaで指定されています。 読み取り
圧縮 snappy ファイルに保存するときに使用する圧縮コーデック。既知の大文字と小文字を区別しない短縮名(none、snappy、zlib、lzo、zstd、およびlz4)のいずれかになります。これは、orc.compressおよびspark.sql.orc.compression.codecを上書きします。 書き込み

その他の一般的なオプションは、汎用ファイルソースオプションにあります。