ORC ファイル
- ORC の実装
- Vectorized Reader
- スキーマのマージ
- Zstandard
- Bloom Filters
- Columnar Encryption
- Hive metastore ORC テーブル変換
- 設定
- データソースオプション
Apache ORC は、ネイティブ zstd 圧縮、ブルームフィルター、列暗号化などの高度な機能を持つ列指向フォーマットです。
ORC の実装
Spark は、spark.sql.orc.impl で制御される 2 つの ORC 実装(native と hive)をサポートしています。2 つの実装は、異なる設計目標を持ちながらも、ほとんどの機能を共有しています。
native実装は、Parquetのような Spark のデータソースの動作に従うように設計されています。hive実装は、Hive の動作に従うように設計されており、Hive SerDe を使用します。
例えば、歴史的に、native 実装は Spark のネイティブ String で CHAR/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.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'
)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.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 データソースはすべてのデータファイルから収集されたスキーマをマージします。false の場合、スキーマはランダムなデータファイルから取得されます。 |
3.0.0 |
spark.sql.hive.convertMetastoreOrc |
true | false に設定すると、Spark SQL は組み込みサポートではなく、Hive SerDe を ORC テーブルに使用します。 | 2.0.0 |
データソースオプション
ORC のデータソースオプションは、
- DataFrameReader の
DataFrameReaderDataFrameWriterDataStreamReaderDataStreamWriter
- CREATE TABLE USING DATA_SOURCE の
OPTIONS句
| プロパティ名 | デフォルト | 意味 | スコープ |
|---|---|---|---|
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 を上書きします。brotli は brotli4j がインストールされている必要があることに注意してください。 |
書き込み |
その他の一般的なオプションについては、 Generic File Source Options を参照してください。