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

ビューとは何ですか?
ビューはテーブルに似ており、要件に基づいて生成されます。ビューは純粋に論理的なオブジェクトであり、独自のストレージを持ちません。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 ではインデックスは依然として有効ですが、新しい作業には上記のいずれかのオプションを使用する方が適しています。
