S-JIS[2011-08-11] 変更履歴

HiveQL INSERT/LOAD

HiveQLHiveのSQLっぽい独自言語)のテーブルへのデータ挿入に関するメモ。


LOAD DATA

ファイルからテーブルへデータを入れるにはLOAD DATAを使う。
テーブルの実体はファイルなので、実際にはファイルのコピーが行われる。

LOAD DATA [LOCAL] INPATH 'パス'
[OVERWRITE] INTO TABLE テーブル名
[PARTITION (項目名=値, …)]

「LOCAL」を付けると、指定したパスはローカルファイル(相対パスの場合はカレントディレクトリーを基準とする)として扱われる。つまりスキーマが「file:」になる。
「LOCAL」を付けないと、フルパスとして扱う。スキーマは、Hadoopが単独環境なら「file:」、分散環境なら「hdfs:」になる。

「OVERWRITE」を付けると上書き、つまり元のデータを消して新しいデータのみの状態となる。
「OVERWRITE」を付けないとデータ追加となる。実態としては、テーブルデータの入っているディレクトリーに新しいファイルをコピーする。


INSERT OVERWRITE

テーブル(SELECT文)から別のテーブルへデータを入れるにはINSERTを使う。

INSERT OVERWRITE TABLE テーブル名
[PARTITION (項目名=値, …)]
SELECT文 FROM 元テーブル名

通常のSQLなら「INSERT INTO」 とするところをわざわざ「INTO」でなく「OVERWRITE」と書いているのは、Hiveではデータ挿入(追加)でなく上書きだから。

※この場合は「SELECT *」でもMapReduceが実行される。


INSERT INTO

LOADが上書き(OVERWRITE)と追加を選べるのにINSERTは出来ないのはおかしいと思ったら…^^;
Hive0.8からは「INSERT INTO」も指定できるらしい。

INSERT INTO TABLE テーブル名
[PARTITION (項目名=値, …)]
SELECT文 FROM 元テーブル名

FROM INSERT

Hiveでは、FROM句を全体の先頭に持ってくることが出来る。

from 元テーブル insert overwrite テーブル名 select 項目,… where 条件;

ただしこの構文は、コピー元テーブルが1つでコピー先テーブルを同時に複数指定する為にある。(multiple inserts)

FROM 元テーブル名
INSERT{OVERWRITE|INTO}TABLE テーブル名 [PARTITION (項目名=値, …)] SELECT文
INSERT{OVERWRITE|INTO}TABLE テーブル名 [PARTITION (項目名=値, …)] SELECT文

INSERT DIRECTORY

インサート先をテーブルでなく(ファイルシステム上の)ディレクトリーにすることが出来る。

INSERT OVERWRITE [LOCAL] DIRECTORY 'ディレクトリー' SELECT文 FROM 元テーブル
FROM 元テーブル
INSERT OVERWRITE [LOCAL] DIRECTORY 'ディレクトリー' SELECT文
INSERT OVERWRITE [LOCAL] DIRECTORY 'ディレクトリー' SELECT文

※この場合は「SELECT *」でもMapReduceが実行される。

指定したディレクトリー内にファイルが作られるが、フィールド区切りは0x01、行区切りは\nで固定。


INSERT VALUES

SQLでは「INSERT INTO テーブル名 VALUES(値, …)」によってテーブルに固定値を入れることが出来る
が、Hiveにはこの構文は無い。

ただ、1レコード以上入っているテーブルがあれば、それを利用してINSERT〜SELECTで固定値を指定することは出来る。

insert overwrite table テーブル名
select 値, … from 何か入っているテーブル limit 1;

2レコード以上入れたい場合はUNIONを利用する。

insert overwrite table テーブル名
select * from(
  select 値, … from 1レコードだけ入っているテーブル union all
  select 値, … from 1レコードだけ入っているテーブル union all
〜
  select 値, … from 1レコードだけ入っているテーブル
) u;

改行コードをデータに入れることによって複数レコード挿入する技(?)


HiveQLへ戻る / Hive目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま