ORC ファイル
- ORC 実装
- ベクトル化されたリーダー
- スキーマのマージ
- Zstandard
- Bloom フィルター
- Columnar Encryption
- Hive メタストア 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
に設定された時に、ベクトル化されたリーダーはnative ORCテーブル(例えばUSING ORC
句を使って生成されたもの)のために使われます。ネスト化されたデータ型((array, map, struct)の場合、ベクトル化されたリーダーはデフォルトで無効になっています。spark.sql.orc.enableNestedColumnVectorizedReader
をtrue
に設定して、これらの型のベクトル化されたリーダーを有効にします。
Hive ORC serdeテーブル(例えば、USING HIVE OPTIONS (fileFormat 'ORC')
句を使って生成されたもの)については、spark.sql.hive.convertMetastoreOrc
もtrue
に設定された場合に、ベクトル化されたリーダーが使われます。デフォルトでオンになっています。
スキーマのマージ
Protocol Buffer, Avro, Thrift と同様に、ORC もスキーマの進化をサポートしています。ユーザは単純なスキーマから開始し、必要に応じて次第にもっとカラムをスキーマに追加することができます。この場合、ユーザは異なるがお互いにスキーマの互換性がある複数のORCファイルにするかも知れません。ORCデータソースは現在では自動的にこのケースを検知し、全てのこれらのファイルのスキーマをマージすることができます。
スキーマのマージは比較的高価な操作であり、多くの場合必要ではないため、デフォルトではoffにしています。以下のようにして有効にすることができます
- ORCファイルを読む時に、データソースオプション
mergeSchema
をtrue
に設定、あるいは - グローバルSQLオプション
spark.sql.orc.mergeSchema
をtrue
に設定。
Zstandard
SparkはHadoop 2と3の両方をサポートします。Spark 3.2以降、両方のHadoopバージョンのORCファイルでZstandard圧縮を利用できます。詳細はZstandardを見てください。
Bloom フィルター
ORCデータソースのbloomフィルターと辞書エンコーディングを制御できます。以下の ORC の例は、bloom フィルタを作成し、favorite_color
に対してのみ辞書エンコーディングを使います。特別なORCオプションについてのより詳細な情報を見つけるには、公式のApache ORC webサイトを訪ねてください。
Columnar Encryption
Spark 3.2以降、Apache ORC 1.6を使うORCテーブルでcolumnar暗号化がサポートされています。次の例では、Hadoop KMSを指定された場所のキープロバイダとして使っています。詳細はApache Hadoop KMSをたずねてください。
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 のうちの1つが成り得ます。native は native ORC サポートを意味します。hive は Hive の ORC ライブラリを意味します。
|
2.3.0 |
spark.sql.orc.enableVectorizedReader |
true |
native 実装でのベクトル化されたorcデコードを有効にします。もしfalse の場合、新しい非ベクトル化ORCリーダーがnative 実装で使われます。hive 実装については、これは無視されます。
|
2.3.0 |
spark.sql.orc.enableNestedColumnVectorizedReader |
false |
ネスト化されたデータ型(array, map and struct)のnative 実装でベクトル化されたorcのデコードを有効にします。spark.sql.orc.enableVectorizedReader がfalse に設定されている場合、これは無視されます。
|
3.2.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のデータソースは次の方法で設定できます:
- the
.option
/.options
methods ofDataFrameReader
DataFrameWriter
DataStreamReader
DataStreamWriter
- CREATE TABLE USING DATA_SOURCEの
OPTIONS
句
プロパティ名 | デフォルト | 意味 | スコープ |
---|---|---|---|
mergeSchema |
false |
全てのORCパートファイルから収集したスキーマをマージすべきかどうかを設定します。これはspark.sql.orc.mergeSchema を上書きします。デフォルト値はspark.sql.orc.mergeSchema で指定されます。 |
read |
圧縮 |
snappy |
ファイルに保存する時に使われる圧縮コーディック。大文字と小文字を区別しない既知の短縮名の1つです(none, snappy, zlib, lzo, zstd, lz4)。これは、orc.compress とspark.sql.orc.compression.codec を上書きします。 |
write |
その他の汎用オプションは、汎用ファイルソースオプションにあります。