連載
» 2009年03月09日 00時00分 公開

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

[鈴木啓修,InterDB]

テーブルの検索:SELECT

 次にSELECT文の書式と使い方を見てみましょう。

[insert_clause] 
SELECT [ALL|DISTINCT] select_list
FROM [table_source|join_source]
[WHERE where_condition] 
[GROUP BY col_list] 
[ORDER BY col_list] 
[CLUSTER BY col_list]
select_list: expression, expression, ...
table_source
  : table_name [table_sample] [alias]
  | ( select_statement ) alias
SELECT文の構文

シンプルなSELECT文

 まずは、最も簡単なテーブルprefを検索してみましょう。カラムの指定には、必ずエイリアスを指定するようにしてください。ワイルドカード「*」も同様です。

hive> SELECT p.* FROM pref p;
OK
1       北海道
2       青森県
3       岩手県
…略…
44      大分県
45      宮崎県
46      鹿児島県
47      沖縄県
Time taken: 0.106 seconds
SELECT文を使ってみる

 では、パーティションを設定したテーブルzipの検索はどのように行うのでしょうか。

 テーブルに設定したパーティションは、SELECT文ではあたかも1つのカラムのように扱います。つまりWHERE句で対象としたいパーティションを設定すればいいのです。

 例えば、2008年12月26日版のテーブルzipを検索したい場合は、次のようにします。

hive> SELECT z.zip, z.pref, z.city, z.town FROM zip z WHERE z.ver = '2008-12-26';
Total MapReduce jobs = 1
… 略…
4200051 22      静岡市葵区      南田町
4200905 22      静岡市葵区      南沼上
4200868 22      静岡市葵区      宮ケ崎町
4200822 22      静岡市葵区      宮前町
4200857 22      静岡市葵区      御幸町
4200053 22      静岡市葵区      弥勒
4212217 22      静岡市葵区      森腰
4211402 22      静岡市葵区      諸子沢
4200028 22      静岡市葵区      屋形町
4211409 22      静岡市葵区      八草
4200906 22      静岡市葵区      薬師
4200013 22      静岡市葵区      八千代町
Time taken: 21.275 seconds
パーティションが設定されている場合の検索

パターンマッチング

 ここからがHiveの本領発揮です。日本中の町名から「銀座」だけ検索してみます。

hive> SELECT z.zip, z.pref, z.city, z.town FROM zip z
    >     WHERE z.ver = '2008-12-26' AND z.town LIKE '銀座';
Total MapReduce jobs = 1
…略…
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: 20.79 seconds
LIKE式による検索

 HiveではLIKE式のほかにもREGEXP式もサポートしています。もちろんLIKE式ではワイルドカード「%」も使えますし、REGEXP式でも各種正規表現が使えます。

テーブルの結合

 Hiveはテーブルの結合もサポートしています。以下に構文を示します。テーブルは2つだけでなく3つでも4つでも結合することが可能です。

join_source: table_source join_clause table_source join_clause table_source ...
join_clause: [LEFT OUTER|RIGHT OUTER|FULL OUTER] JOIN ON (equality_expression, equality_expression, ...)
equality_expression: expression = expression
テーブル結合の構文

 具体例でHiveによるテーブルの結合を見てみましょう。

 先ほど実行した「銀座」を抽出するSELECT文は、都道府県が数値なので分かりにくいものです。そこで都道府県データテーブルprefを結合して、より読みやすくしてみましょう。

hive> SELECT z.zip, p.pref, z.city, z.town FROM zip z
    >    LEFT OUTER JOIN pref p ON (p.id = z.pref)
    >     WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';
Total MapReduce jobs = 1
…略…
Ended Job = job_200901011221_0005
OK
0691331 北海道  夕張郡長沼町    銀座
3670052 埼玉県  本庄市  銀座
3600032 埼玉県  熊谷市  銀座
1040061 東京都  中央区  銀座
3950031 長野県  飯田市  銀座
3940022 長野県  岡谷市  銀座
4240817 静岡県  静岡市清水区    銀座
4480845 愛知県  刈谷市  銀座
7450032 山口県  周南市  銀座
7700916 徳島県  徳島市  銀座
8040076 福岡県  北九州市戸畑区  銀座
3220052 栃木県  鹿沼市  銀座
Time taken: 69.588 seconds
テーブルの結合

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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