Hiveビューとインデックス作成:例を用いて作成する

⚡ スマートサマリー

Hiveにおけるビューは、読み取り専用テーブルのように動作する保存済みクエリであり、インデックスは列へのポインタであり、検索を高速化します。どちらも、ここに示したような短いHiveQLステートメントで作成されます。

  • 👁️ ビューは論理的です。 ビューはメタストアにSELECT文のみを格納するため、ビュー自体がディスク容量を占有することはありません。
  • 🔒 設計上読み取り専用: ビューはLOAD、INSERT、ALTERの対象にすることはできません。なぜなら、Hiveはクエリごとにビューを新たに評価するからです。
  • 📍 インデックスはデータを指します。 インデックスとは、列の値へのポインタであり、Hiveがテーブル全体ではなくファイルの一部を読み取ることを可能にするものです。
  • 🗂️ 2人の担当者: コンパクトインデックスはカーディナリティの高い列に適しており、ビットマップインデックスは異なる値が少ない列に適しています。
  • 🔄 手動再構築: インデックスは自動的に更新されないため、ベーステーブルの変更後には必ずALTER INDEX REBUILDを実行する必要があります。
  • 🚫 Hive 3.0で削除されました: HIVE-18448でインデックス作成機能は廃止され、マテリアライズドビュー、ORCまたはParquetストレージおよびパーティショニングがそれに取って代わりました。

Hiveにおけるビューとインデックスを例を交えて解説します。

ビューとは何ですか?

ビューはテーブルに似ており、要件に基づいて生成されます。ビューは純粋に論理的なオブジェクトであり、独自のストレージを持ちません。Hiveはクエリテキストのみをメタストアに保持し、ビューが参照されるたびにそれを評価します。

  • 結果セットのデータを Hive のビューとして保存できます。
  • 使用方法は、ビューで使用されているものと似ています。 SQL
  • ビューは読み取り専用であるため、データを書き込むLOAD、INSERT、またはALTERステートメントのターゲットにすることはできません。

ビューの作成:

構文:

Create VIEW <VIEWNAME> AS SELECT

完全なドキュメント化された形式では、IF NOT EXISTS 句とオプションの列リストも受け付けます。これは、SELECT リストに単純な列名ではなく式が含まれている場合に便利です。

例:

Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000

この例では、給与フィールドが25000より大きいすべての行値を表示するビュー「Sample_View」を作成します。フィルタはビュー内に存在するため、Sample_Viewから選択するクエリは、該当する行のみを表示します。

インデックスとは?

インデックスは、テーブルの特定の列名へのポインタです。インデックスの目的は、検索速度を向上させることです。インデックスがない場合、次のような述語を持つクエリは、 WHERE tab1.col1 = 10 テーブル全体またはパーティション全体をロードしてすべての行を処理する一方、col1 にインデックスがあると、Hive はファイルの一部のみを読み取ることができます。

  • ユーザーはインデックスを手動で定義する必要があります
  • インデックスを作成するということは、テーブルの特定の列名へのポインターを作成することを意味します。
  • テーブル内の列に加えられた変更はすべて、列名に作成されたインデックス値を使用して保存されます。

その高速化は無料ではない。インデックスの作成には追加の処理コストがかかり、インデックス自体もテーブルと並行して維持管理する必要のあるディスク容量を占有する。

構文:

Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>

例:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

ここでは、テーブル guruhive_internaltable に id 列のインデックスを作成しています。なお、インデックス作成をサポートするリリースでは、完全なステートメントにはインデックスハンドラー句も必要となります。次のセクションでその詳細を説明します。

Hiveにおけるビューとインデックスの違い

ビューとインデックスは、どちらも既存のテーブルの上に構築されるため、しばしば一緒に紹介されますが、解決する問題は異なります。ビューはクエリが参照するデータを変更するのに対し、インデックスはHiveがデータを見つける速度を変更します。以下の表で両者を比較します。

側面 表示 目次
何を保管しているか メタストア内のSELECT文のみ データへのポインタを保持する別のインデックステーブル
目的 クエリが返す内容を簡素化または制限する 述語のスキャン対象データ量を削減する
ディスクコスト なし データ変更後のストレージ拡張と再構築
書き込みアクセス 読み取り専用の 直接クエリされるのではなく、オプティマイザが使用します。
現在のステータス 完全にサポート Hive 3.0で削除されました

実際には、ビューは可読性とアクセス制御のために作成され、インデックスは特定の列のパフォーマンス向上のみを目的として作成されます。

Hiveにおけるインデックスの種類と構文

Hive 2.x までのリリースでは、2 つのインデックス ハンドラが同梱されており、ハンドラは必須の AS 句で指定されます。コンパクト インデックス機能は Hive 0.7.0 で、ビットマップ インデックス機能は Hive 0.8.0 で導入されました。

  • コンパクトインデックス: 個々の出現箇所を記録する代わりに、値とその値が格納されているHDFSブロックのアドレスを一緒に保存します。これは、多数の異なる値を持つ列に適しています。
  • ビットマップインデックス: 異なる値ごとにビットマップを保存します。これは、ステータスや性別フラグなど、異なる値の数が少ない列の場合によく用いられる方法です。

コンパクトインデックスは、以下のように作成、一覧表示、削除されます。

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

WITH DEFERRED REBUILD オプションは、インデックスを登録しますが、インデックスにデータを格納することはありません。そのため、ALTER INDEX を使用してビルドを個別にスケジュールできます。ビットマップ インデックスも同様の方法で作成されますが、ハンドラー名は異なります。

CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;

インデックスは自動的に更新されません。ベーステーブルに新しいデータを受信するたびに、ALTER INDEX … REBUILD を再度実行する必要があります。パーティションテーブルの場合、再構築は単一のパーティションに限定できます。

Hive 3.0でインデックス機能が削除された理由

インデックス機能は、HIVE-18448 に基づきバージョン 3.0 で Hive から削除されたため、現在のクラスターでは CREATE INDEX、SHOW INDEX、DROP INDEX は利用できなくなりました。カラム型ストレージとコストベースのオプティマイザが成熟するにつれて、この機能は再構築コストに見合う価値がほとんどなくなりました。3 つの代替機能が同様の機能を提供します。

  • マテリアライズドビュー: Hive 3.0.0で導入された マテリアライズドビュー クエリの事前計算結果を保存し、オプティマイザは受信したクエリを自動的にその結果に基づいて書き換えます。
  • 列形式のファイルフォーマット: ORCとParquetは独自の軽量インデックスと最小/最大統計情報を備えているため、リーダーはユーザー定義のインデックスを使用せずに、ストライプ全体、ブロック全体、またはファイル全体をスキップできます。
  • パーティションとバケット: パーティショニングとバケット化 ディレクトリおよびファイルレベルでデータを削除する。これは通常、インデックス作成よりもはるかに多くの入力データを削除する。

Hive 2.x ではインデックスは依然として有効ですが、新しい作業には上記のいずれかのオプションを使用する方が適しています。

よくあるご質問

DROP VIEW view_name でビューを削除し、ALTER VIEW view_name RENAME TO new_name でビューの名前を変更します。ビューにはデータがないため、削除しても問題ありません。ping ベーステーブルには一切手を加えず、メタストアのエントリのみを削除する。

マテリアライズドビューは、事前に計算されたクエリ結果を実データとして格納するため、ディスク容量を消費し、再構築が必要です。通常のビューはクエリテキストのみを格納し、参照されるたびに再計算されます。

いいえ。メタストアにはSELECT文と解決済みの列リストのみが保持され、それ以外は何も保持されません。参照するたびに基となるクエリが再実行されるため、低速な結合処理を経由するビューは低速のままです。

Hive 0.12.0以前のバージョンでは、CREATE INDEXとDROP INDEXではインデックス名の大文字小文字が区別されていましたが、ALTER INDEXでは小文字が必要でした。Hive 0.13.0では、すべてのステートメントでインデックス名の大文字小文字が区別されなくなりました。

はい、最新のクラスターであればどれでも可能です。パーティションプルーニングはスキャン開始前にディレクトリ全体を削除し、バケット化は結合またはサンプリングを特定のファイルに絞り込むため、通常はインデックステーブルよりも優れた結果が得られます。

機械学習ツールは、クエリログをプロファイリングし、述語列を選択性と頻度に基づいてランク付けし、マテリアライズドビューまたはパーティションスキームが有効な箇所を提案します。提案を適用する前に、EXPLAINプランに対してそれぞれの提案を検証してください。

短いコメントから確実にCREATE VIEW文を生成します。ただし、バージョン固有の記述については必ず確認してください。Hive 3.0以降のクラスタでは拒否されるCREATE INDEX構文が依然として生成されるためです。

インデックスはポインタの独立したテーブルであり、ベーステーブルが変更されてもHiveはインデックスを更新しません。再構築を行わないとポインタが古くなり、オプティマイザはインデックスをスキップするか、古い一致結果を返します。