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
をサポートすることで、この違いを解消します。
ベクトル化されたリーダー
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'
)
ブルームフィルター
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.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は組み込みのサポートの代わりに、ORCテーブルにHive SerDeを使用します。 | 2.0.0 |
データソースオプション
ORCのデータソースオプションは、次のように設定できます。
- 次の
.option
/.options
メソッドDataFrameReader
DataFrameWriter
DataStreamReader
DataStreamWriter
- CREATE TABLE USING DATA_SOURCEの
OPTIONS
句
プロパティ名 | デフォルト | 意味 | スコープ |
---|---|---|---|
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 を上書きします。 |
書き込み |
その他の一般的なオプションは、汎用ファイルソースオプションにあります。