SQLライクにHadoop Hiveを使い倒す!:Hive――RDB使いのためのHadoopガイド(後編)(3/3 ページ)
前回の記事では、手元のマシン上にHadoop環境を構築してHiveを導入し、基本的な操作を確認しました。今回は同じ環境を使って、より実践的なデータ操作についてみていきます。
データの保存:INSERT
検索結果を画面に表示するだけでは先に進まないので、次にデータを保存する方法を説明します。
Hiveではデータを保存するためにINSERT文を使います。これはSQLのINSERT文と大きく異なる部分で、テーブルのデータを更新するのではなく、次々と新しいテーブルやファイルを作って処理を進めていきます。
具体的には、次の3つの方法があります。
- Hiveのテーブルにデータを直接インサート
- HDFS注のファイルとして保存注のファイルとして保存
- ユーザーが直接扱う(普通の)ファイルとして保存
以降でそれぞれを見ていきましょう。
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文の使い方の例として、テーブル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を検索してみましょう。データがインサートされていることが確認できます。
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 '銀座';
実際にファイルが保存されたかどうか、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 '銀座';
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に多くのユーザーが目を向けるようになると思われます。
Copyright © ITmedia, Inc. All Rights Reserved.