HiveQL(HiveのSQLっぽい独自言語)のテーブルへのデータ挿入に関するメモ。
|
|
ファイルからテーブルへデータを入れるにはLOAD DATAを使う。
テーブルの実体はファイルなので、実際にはファイルのコピーが行われる。
LOAD DATA [LOCAL] INPATH 'パス' [OVERWRITE] INTO TABLE テーブル名 [PARTITION (項目名=値, …)]
「LOCAL」を付けると、指定したパスはローカルファイル(相対パスの場合はカレントディレクトリーを基準とする)として扱われる。つまりスキーマが「file:」になる。
「LOCAL」を付けないと、フルパスとして扱う。スキーマは、Hadoopが単独環境なら「file:」、分散環境なら「hdfs:」になる。
「OVERWRITE」を付けると上書き、つまり元のデータを消して新しいデータのみの状態となる。
「OVERWRITE」を付けないとデータ追加となる。実態としては、テーブルデータの入っているディレクトリーに新しいファイルをコピーする。
テーブル(SELECT文)から別のテーブルへデータを入れるにはINSERTを使う。
INSERT OVERWRITE TABLE テーブル名 [PARTITION (項目名=値, …)] SELECT文 FROM 元テーブル名
通常のSQLなら「INSERT INTO」 とするところをわざわざ「INTO」でなく「OVERWRITE」と書いているのは、Hiveではデータ挿入(追加)でなく上書きだから。
※この場合は「SELECT *」でもMapReduceが実行される。
LOADが上書き(OVERWRITE)と追加を選べるのにINSERTは出来ないのはおかしいと思ったら…^^;
Hive0.8からは「INSERT INTO」も指定できるらしい。
INSERT INTO TABLE テーブル名 [PARTITION (項目名=値, …)] SELECT文 FROM 元テーブル名
Hiveでは、FROM句を全体の先頭に持ってくることが出来る。
from 元テーブル insert overwrite テーブル名 select 項目,… where 条件;
ただしこの構文は、コピー元テーブルが1つでコピー先テーブルを同時に複数指定する為にある。(multiple inserts)
FROM 元テーブル名 INSERT{OVERWRITE|INTO}TABLE テーブル名 [PARTITION (項目名=値, …)] SELECT文 INSERT{OVERWRITE|INTO}TABLE テーブル名 [PARTITION (項目名=値, …)] SELECT文 …
インサート先をテーブルでなく(ファイルシステム上の)ディレクトリーにすることが出来る。
INSERT OVERWRITE [LOCAL] DIRECTORY 'ディレクトリー' SELECT文 FROM 元テーブル
FROM 元テーブル INSERT OVERWRITE [LOCAL] DIRECTORY 'ディレクトリー' SELECT文 INSERT OVERWRITE [LOCAL] DIRECTORY 'ディレクトリー' SELECT文 …
※この場合は「SELECT *」でもMapReduceが実行される。
指定したディレクトリー内にファイルが作られるが、フィールド区切りは0x01、行区切りは\nで固定。
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;
→改行コードをデータに入れることによって複数レコード挿入する技(?)