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に設定された時に、ベクトル化されたリーダーはnative ORCテーブル(例えばUSING ORC句を使って生成されたもの)のために使われます。ネスト化されたデータ型((array, map, struct)の場合、ベクトル化されたリーダーはデフォルトで無効になっています。spark.sql.orc.enableNestedColumnVectorizedReadertrueに設定して、これらの型のベクトル化されたリーダーを有効にします。

Hive ORC serdeテーブル(例えば、USING HIVE OPTIONS (fileFormat 'ORC')句を使って生成されたもの)については、spark.sql.hive.convertMetastoreOrctrueに設定された場合に、ベクトル化されたリーダーが使われます。デフォルトでオンになっています。

スキーマのマージ

Protocol Buffer, Avro, Thrift と同様に、ORC もスキーマの進化をサポートしています。ユーザは単純なスキーマから開始し、必要に応じて次第にもっとカラムをスキーマに追加することができます。この場合、ユーザは異なるがお互いにスキーマの互換性がある複数のORCファイルにするかも知れません。ORCデータソースは現在では自動的にこのケースを検知し、全てのこれらのファイルのスキーマをマージすることができます。

スキーマのマージは比較的高価な操作であり、多くの場合必要ではないため、デフォルトではoffにしています。以下のようにして有効にすることができます

  1. ORCファイルを読む時に、データソースオプション mergeSchematrueに設定、あるいは
  2. グローバルSQLオプションspark.sql.orc.mergeSchematrueに設定。

Zstandard

SparkはHadoop 2と3の両方をサポートします。Spark 3.2以降、両方のHadoopバージョンのORCファイルでZstandard圧縮を利用できます。詳細はZstandardを見てください。

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

Bloom フィルター

ORCデータソースのbloomフィルターと辞書エンコーディングを制御できます。以下の ORC の例は、bloom フィルタを作成し、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'
)

Columnar Encryption

Spark 3.2以降、Apache ORC 1.6を使うORCテーブルでcolumnar暗号化がサポートされています。次の例では、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 のうちの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.enableVectorizedReaderfalseに設定されている場合、これは無視されます。 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のデータソースは次の方法で設定できます:

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

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

TOP
inserted by FC2 system