tands_bの日記

技術メモ。大したことは書きません

【Hive】テーブル仕様

論理構成

 Hiveは「保存されているデータ」と「テーブル中のデータレイアウトを記述するメタデータ」の二つから構成されている。それぞれデータの保存場所が異なる。

データ種別 保存場所
保存データ HDFS
メタデータ RDB

テーブル仕様

管理対象テーブル

 管理対象テーブルとは、Hiveで通常のテーブル作成を行なった場合にできるテーブルのことを指す。LOADしたデータファイルはHiveの保管用ディレクトリに移動し、テーブル削除を行うタイミングで移動したデータファイルも削除される。

外部テーブル

 テーブル作成時にEXTERNALを指定すると外部テーブル作成になる。Hiveの保管用ディレクトリ以外に存在するデータ ファイルをそのまま参照し、テーブル削除時にはRDBからメタデータのみ削除する。

パーティション

 Hiveのテーブルではデータをパーティション群(データを分割したもの)として取り扱うことができる。例えば日付でパーティションを区切っておくと、クエリで日付を条件とした場合に対象パーティションファイルだけをスキャンすればよくなるため効率的になる。

# パーティション付きテーブルの作成
CREATE TABLE t_partition (col1 INT, col2 STRING)
PARTITIONED BY (date STRING, country STRING);

# パーティション化されたテーブルにデータをロード
LOAD DATA LOCAL INPATH 'input/hive/partitions/fileA'
INTO TABLE t_partition
PARTITION (date='2017/09/24', country='JP')

バケット

 指定した列のハッシュ値を元に、テーブルをパケット化(データブロック化)することができる。テーブルをJOINする場合、結合列がバケットされていればテーブル全体をフェッチする必要がないので効率よくJOIN処理が可能になる。なお、全バケットに均一な数のデータが入るわけではない。

# バケット付きテーブルの作成。バケット数も指定する。
CREATE TABLE t_bucket (col1 INT, col2 STRING)
CLUSTERED BY (col1) INTO 3 BUCKETS;

# バケット列をソートしておくとより効率よくmap側で結合できる
CREATE TABLE t_bucket (col1 INT, col2 STRING)
CLUSTERED BY (col1) SORTED BY (col1 ASC) INTO 3 BUCKETS;

# 半分のバケットからデータを取得する例
SELECT * FROM t_bucket
TABLESAMPLE(BUCKET 1 OUT OF 2 ON col1)