SQLライクにHadoop Hiveを使い倒す!Hive――RDB使いのためのHadoopガイド(後編)(3/3 ページ)

» 2009年03月09日 00時00分 公開
[鈴木啓修InterDB]
前のページへ 1|2|3       

データの保存:INSERT

 検索結果を画面に表示するだけでは先に進まないので、次にデータを保存する方法を説明します。

 Hiveではデータを保存するためにINSERT文を使います。これはSQLのINSERT文と大きく異なる部分で、テーブルのデータを更新するのではなく、次々と新しいテーブルやファイルを作って処理を進めていきます。

 具体的には、次の3つの方法があります。

  1. Hiveのテーブルにデータを直接インサート
  2. HDFS注のファイルとして保存注のファイルとして保存
  3. ユーザーが直接扱う(普通の)ファイルとして保存

 以降でそれぞれを見ていきましょう。

注:HDFSはHadoopが採用している分散ファイルシステム。

1:Hiveのテーブルにデータを直接インサート

 HiveのINSERT文の構文は以下のとおりです。

insert_clause: FROM from_statement INSERT OVERWRITE destination 
select_statement
destination:
TABLE table_name [PARTITION (partition_col = partition_col_value,
partition_col = partiton_col_value, ...)]
| DIRECTORY '/hdfs/path'
| [LOCAL] DIRECTORY '/local/path'
INSERT文の構文
注:INSERT文の構文は0.19.1で変更されています。0.19.0以前のバージョンでは構文エラーとなるので注意してください。

 INSERT文の使い方の例として、テーブルginza_zipを定義し、このテーブルにデータを保存する方法を示します。

hive> CREATE TABLE ginza_zip (zip STRING, pref INT, city STRING, town
STRING)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> LINES TERMINATED BY '\n';
OK
Time taken: 2.767 seconds
hive> FROM zip z
> INSERT OVERWRITE TABLE ginza_zip
> SELECT z.zip, z.pref, z.city, z.town
> WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';
テーブル「ginza_zip」を定義してデータを保存する

 テーブルginza_zipを検索してみましょう。データがインサートされていることが確認できます。

hive> SELECT g.* FROM ginza_zip g;
OK
4240817 22      静岡市清水区    銀座
4480845 23      刈谷市  銀座
7450032 35      周南市  銀座
7700916 36      徳島市  銀座
8040076 40      北九州市戸畑区  銀座
0691331 1       夕張郡長沼町    銀座
3220052 9       鹿沼市  銀座
3600032 11      熊谷市  銀座
3670052 11      本庄市  銀座
1040061 13      中央区  銀座
3940022 20      岡谷市  銀座
3950031 20      飯田市  銀座
Time taken: 0.211 seconds
データ内容を確認する

2:HDFSのファイルとして保存

 次に、HDFS上のファイルとして保存する方法を示します。ここでは、HDFSのディレクトリ「/user/hive/ginza」以下にファイルを保存することにします。

hive> FROM zip z
> INSERT OVERWRITE DIRECTORY '/user/hive/ginza'
> SELECT z.zip, z.pref, z.city, z.town
> WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';
HDFSの「ファイル」として保存

 実際にファイルが保存されたかどうか、Hadoopのコマンドを使って調べてみましょう。

hiveuser> $HADOOP_HOME/bin/hadoop dfs -lsr /user/hive/ginza
-rw-r--r--   3 hiveuser supergroup        161 2009-01-01 14:34 /user/hive/ginza/attempt_200901011221_0008_m_000000_0
-rw-r--r--   3 hiveuser supergroup        203 2009-01-01 14:34 /user/hive/ginza/attempt_200901011221_0008_m_000001_0
ファイルがあるか確認する

 指定したHDFSのディレクトリ以下に、2つのファイルが生成されているのが分かります。結果はこの2つのファイルに分散されて保存されています。

 データの保存のためにファイル名でなくディレクトリを指定するのは不便ですが、Hadoopが大量のデータを分散処理する仕組みであることを思い出すと、数Gバイトを超える大規模データを扱うには必要な処置なのかもしれません。

 さらに、現時点ではファイル内のデータ項目の区切り文字は「^A」(Ctrl-A)と決め打ちになっており、こちらの方が不便です。Hiveのソースコードには「いずれ改良する」とのコメントがあるので、将来的には解消されると思われますが。

3:ユーザーが直接扱う(普通の)ファイルとして保存

 最後に、HadoopのHDFSの世界から、UNIXの普通のファイルシステムの世界にデータを書き込んでもらいましょう。

 INSERT文に「LOCAL DIRECTORY」と指定するだけです。これで、私たちが普通に利用できるディレクトリ以下にファイルが作成されます。

hive> FROM zip z
> INSERT OVERWRITE LOCAL DIRECTORY '/home/hiveuser/localfiles/ginza'
> SELECT z.zip, z.pref, z.city, z.town
> WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';
HDFSからローカルディレクトリに書き込みを行う
hiveuser> ls -la /home/hiveuser/localfiles/ginza/
合計 24
drwxrwxr-x 2 hiveuser hiveuser 4096  1月  1 14:38 .
drwxrwxr-x 3 hiveuser hiveuser 4096  1月  1 14:38 ..
-rw-rw-r-- 1 hiveuser hiveuser   12  1月  1 14:38 .attempt_200901011221_0009_m_000000_0.crc
-rw-rw-r-- 1 hiveuser hiveuser   12  1月  1 14:39 .attempt_200901011221_0009_m_000001_0.crc
-rwxrwxrwx 1 hiveuser hiveuser  161  1月  1 14:38 attempt_200901011221_0009_m_000000_0
-rwxrwxrwx 1 hiveuser hiveuser  203  1月  1 14:39 attempt_200901011221_0009_m_000001_0
ローカルに保存されたファイルを確認

まとめ:Hadoopを直接操作するよりも簡単!

 以上、駆け足でHiveについて説明しました。

 Hadoopは米国Yahoo! をはじめ多くの企業での利用が本格化しつつあり、今後のIT業界で必須技術となる勢いがあります。

 このような状況下でのHiveの位置付けですが、実際に使ってみると、Hadoopから直接データを扱うよりもテーブルを使った方が直感的かつ簡単に扱える場合が多いことに気付きました。そもそも私たちが得るデータの多くはRDBMSに保存されているわけですから、それをそのまま保存できる利点は大きいはずです。

 例えば、日々の運用でデータベースに刻々とためられるデータをHadoopに転送して永久保存する、もちろんため込んだデータは日夜分析する、という使い方が普及していくのならば、データをテーブルという概念で扱えるHiveに多くのユーザーが目を向けるようになると思われます。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。