Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

Hadoopをより便利に使う!HiveでのMapReduceまとめ


目次

  1. Hiveとは
  2. Hiveの設定
  3. HiveQL構文(DDL)
    1. DataBase/SCHEMAの作成
    2. Database/SCHEMAの削除
    3. Tableの作成
    4. Tableの削除
    5. Table名変更
    6. Partition作成
    7. Partitionの削除
    8. Columnの変更
    9. Columnの追加/置き換え
    10. TableのProperty変更
    11. SerDe Propertyの追加
  4. HiveQL構文(SQL)
    1. テーブル一覧表示
    2. テーブルの内容を表示
    3. 基本的なSELECT文
    4. WHERE句(条件指定)
    5. DISTINCT(重複削除)
    6. ORDER BY / SORT BY句(ソート)
    7. GROUP BY句(グループ化)
    8. HAVING句(グループ化後の条件)
    9. LIMIT句
    10. JOIN(テーブル結合)
    11. 抽出カラムを正規表現で指定
    12. UNION(結果の結合)
    13. SUBQUERY
    14. LOAD(データの読み込み)
  5. Hiveを使う
    1. 事前準備
    2. 起動と終了
    3. テーブルの定義
    4. データの読み込み
    5. Tableのパーティション定義
    6. 検索/MapReduce
    7. SELECT結果をINSERT
    8. ローカルファイルとして保存
  6. まとめ
  7. リンク

Hiveとは

  • 2008年にFaceBookで開発さえてHadoopプロジェクトに寄贈される。
  • Yahoo!で開発しているPigのライバルプロジェクト?
  • 一言で表すとHadoop上で動作するデータウエアハウス
  • HiveQLというSQLのような言語でHDFSなどの分散ファイルシステム上のデータを操作できる。
  • HiveQLの実行でMap/Reduce処理が完了する。
  • 私見だが複雑なデータのMapReduceから特定のデータを抽出したい場合には便利かも。

Hiveの設定

HiveQL構文(DDL)

  • HiveQLはRDBSQLと似た構文となっているので理解がしやすい。
DataBase/SCHEMAの作成
  • 構文
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];
  • サンプル
CREATE DATABASE IF NOT EXISTS logs;
Database/SCHEMAの削除
  • 構文
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
  • サンプル
DROP DATABASE IF EXISTS logs;
Tableの作成
  • 構文
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name data_type [COMMENT col_comment], ...)]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [
   [ROW FORMAT row_format] [STORED AS file_format]
   | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  (Note:  only available starting with 0.6.0)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]  (Note:  only available starting with 0.6.0)
  [AS select_statement]  (Note: this feature is only available starting with 0.5.0, and is not supported when creating external tables.)

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path]

data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type

primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | STRING

array_type
  : ARRAY < data_type >

map_type
  : MAP < primitive_type, data_type >

struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>

row_format
  : DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

file_format:
  : SEQUENCEFILE
  | TEXTFILE
  | RCFILE     (Note:  only available starting with 0.6.0)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
  • サンプル
    • csvファイルを改行コードで1行として扱い、カンマで区切った値を格納する。
CREATE TABLE logs(id INT, created_at STRING) row format delimited fields terminated by ',' lines terminated by '\n';
    • date項目でPartisionを設定する。(Partitionを設定するとそのカラムでの項目ごとの集計が簡単にできる。)
CREATE TABLE logs(id INT, created_at STRING) PARTITIONED BY(date STRING) row format delimited fields terminated by ',' lines terminated by '\n';
Tableの削除
  • 構文
DROP TABLE [IF EXISTS] table_name
  • サンプル
DROP TABLE logs;
Table名変更
  • 構文
ALTER TABLE table_name RENAME TO new_table_name
  • サンプル
ALTER TABLE logs RENAME TO logs_yesterday;
Partition作成
  • 構文
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...

partition_spec:
  : (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
  • サンプル
ALTER TABLE logs ADD PARTITION (date = '2011-12-14') location '/path/to/part111214';
Partitionの削除
  • 構文
ALTER TABLE table_name DROP [IF EXISTS] partition_spec, partition_spec,...
  • サンプル
ALTER TABLE logs DROP PARTITION (date = '2011-12-14');
Columnの変更
  • 構文
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
  • サンプル
    • Columnの名前を変更
ALTER TABLE logs CHANGE COLUMN created_at created_date;
Columnの追加/置き換え
  • 構文
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  • サンプル
ALTER TABLE logs ADD update_date STRING;
TableのProperty変更
  • 構文
ALTER TABLE table_name SET TBLPROPERTIES table_properties

table_properties:
  : (property_name = property_value, property_name = property_value, ... )
  • サンプル
    • 外部テーブルに変更
ALTER TABLE logs SET TBLPROPERTIES ('EXTERNAL'=true);
SerDe Propertyの追加
  • SerDeとはHiveのシリアライズ/デシリアライズデータを作るクラスの事。
  • 行フォーマットを定義するために使う。(行と行のフィールドがどのように保存されるかを示す。)
  • 構文
ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties]
ALTER TABLE table_name SET SERDEPROPERTIES serde_properties

serde_properties:
  : (property_name = property_value, property_name = property_value, ... )
  • サンプル
ALTER TABLE logs SET SERDEPROPERTIES ( 'field.delim' = ',' );

HiveQL構文(SQL)

  • これもRDBと同じような構文。SELECTなど。
テーブルの一覧を表示
  • 一覧
SHOW TABLES;
SHOW PARTITIONS logs;
テーブルの内容を表示
DESCRIBE logs;
基本的なSELECT文
  • 構文
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[CLUSTER BY col_list
  | [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]
  • サンプル
SELECT * FROM logs;
WHERE句(条件指定)
SELECT * FROM logs WHERE id > 10 AND created_at = "US";
DISTINCT(重複削除)
SELECT DISTINCT created_at FROM logs;
ORDER BY / SORT BY(ソート)
  • ORDER BY構文
colOrder: ( ASC | DESC )
orderBy: ORDER BY colName colOrder? (',' colName colOrder?)*
query: SELECT expression (',' expression)* FROM src orderBy
  • SORT BY構文
colOrder: ( ASC | DESC )
sortBy: SORT BY colName colOrder? (',' colName colOrder?)*
query: SELECT expression (',' expression)* FROM src sortBy
  • サンプル
SELECT * FROM logs SORT BY date ASC, created_at DESC;
GROUP BY句(グループ化)
  • 構文
groupByClause: GROUP BY groupByExpression (, groupByExpression)*

groupByExpression: expression

groupByQuery: SELECT expression (, expression)* FROM src groupByClause?
  • サンプル
SELECT * FROM logs GROUP BY created_at;
HAVING句(グループ化後の条件)
SELECT * FROM logs GROUP BY created_at HAVING COUNT( id ) > 10;
LIMIT句
SELECT * FROM logs LIMIT 5;
JOIN(テーブル結合)
  • 構文
join_table:
    table_reference JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
  | table_reference LEFT SEMI JOIN table_reference join_condition

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [alias]
  | table_subquery alias
  | ( table_references )

join_condition:
    ON equality_expression ( AND equality_expression )*

equality_expression:
    expression = expression
  • サンプル
SELECT logs.* FROM logs JOIN logs2 ON ( logs.id = logs2.id );
抽出カラムを正規表現で指定
SELECT <REGEX> FROM logs;
UNION(結果の結合)
  • 構文
select_statement UNION ALL select_statement UNION ALL select_statement ...
  • サンプル
SELECT id,created_at FROM logs WHERE  date = '2011-12-15' UNION ALL SELECT id,created FROM logs2 WHERE date = '2011-12-15' ; 
SUBQUERY
  • 構文
SELECT ... FROM (subquery) name ...
  • サンプル
SELECT col FROM ( SELECT a+b AS col FROM logs2 ) logs; 
LOAD(データの読み込み)
  • 構文
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
  • サンプル
LOAD DATA INPATH '/user/data/pv_2011-12-15_us.txt' INTO TABLE logs PARTITION(date='2011-12-15', created_at='US');

Hiveを使う

事前準備
  • ファイルダウンロード
$ wget wget http://www.atmarkit.co.jp/fdb/single/s_hive/dl/data.tar.gz
$ tar -xzf data.tar.gz
  • 解凍フォルダの確認
    • ファイル一覧
$ tree
|-- pref.csv
|-- zip20081128.csv
`-- zip20081226.csv
    • pref.csv都道府県番号と都道府県名をカンマ区切りで格納。
1,北海道
2,青森県
3,岩手県
4,宮城県
5,秋田県
6,山形県
7,福島県
8,茨城県
(略)
    • zipYYYYMMDD.csvは郵便番号と住所をカンマ区切りで格納。
0600000,1,札幌市中央区,
0640941,1,札幌市中央区,旭ケ丘
0600041,1,札幌市中央区,大通東
0600042,1,札幌市中央区,大通西(1〜19丁目)
0640820,1,札幌市中央区,大通西(20〜28丁目)
0600031,1,札幌市中央区,北一条東
0600001,1,札幌市中央区,北一条西(1〜19丁目)
0640821,1,札幌市中央区,北一条西(20〜28丁目)
0600032,1,札幌市中央区,北二条東
0600002,1,札幌市中央区,北二条西(1〜19丁目)
起動と終了
  • 起動
$ /usr/bin/hive 
Hive history file=/tmp/yuta/hive_job_log_yuta_201112140914_1577424059.txt
hive> 
  • 終了
hive> exit;
テーブルの定義
  • pref.csvを行内でカンマ区切りでデータを格納するための定義。
hive> CREATE TABLE pref (id int, pref STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
OK
Time taken: 11.761 seconds
データの読み込み
  • 読み込み
hive> LOAD DATA LOCAL INPATH '/home/yuta/work/dev/hadoop/hive/localfiles/pref.csv' OVERWRITE INTO TABLE pref;
Copying data from file:/home/yuta/work/dev/hadoop/hive/localfiles/pref.csv
Copying file: file:/home/yuta/work/dev/hadoop/hive/localfiles/pref.csv
Loading data to table default.pref
Deleted hdfs://localhost/user/hive/warehouse/pref
OK
Time taken: 0.919 seconds
  • 確認
hive> SELECT * FROM pref;
OK
1	北海道
2	青森県
3	岩手県
4	宮城県
5	秋田県
6	山形県
7	福島県
8	茨城県
(略)
Tableのパーティション定義
hive> CREATE TABLE zip (zip STRING, pref INT, city STRING, town STRING) PARTITIONED BY (ver DATE) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
FAILED: Error in semantic analysis: DATE, DATETIME, and TIMESTAMP types aren't supported yet. Please use STRING instead.

※どうもDATE,DATETIME,TIMESTAMPがまだサポートされていないバージョンのようだ。指示通りSTRINGに変えて試してみる。

hive> CREATE TABLE zip (zip STRING, pref INT, city STRING, town STRING) PARTITIONED BY (ver STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
OK
Time taken: 0.098 seconds
hive> LOAD DATA LOCAL INPATH '/home/yuta/work/dev/hadoop/hive/localfiles/zip20081128.csv' OVERWRITE INTO TABLE zip PARTITION (ver = '2008-11-28');
Copying data from file:/home/yuta/work/dev/hadoop/hive/localfiles/zip20081128.csv
Copying file: file:/home/yuta/work/dev/hadoop/hive/localfiles/zip20081128.csv
Loading data to table default.zip partition (ver=2008-11-28)
OK
Time taken: 1.517 seconds

hive> LOAD DATA LOCAL INPATH '/home/yuta/work/dev/hadoop/hive/localfiles/zip20081226.csv' OVERWRITE INTO TABLE zip PARTITION (ver = '2008-12-26');
Copying data from file:/home/yuta/work/dev/hadoop/hive/localfiles/zip20081226.csv
Copying file: file:/home/yuta/work/dev/hadoop/hive/localfiles/zip20081226.csv
Loading data to table default.zip partition (ver=2008-12-26)
OK
Time taken: 0.76 seconds
  • データの確認
SELECT * from zip;
OK
0600000	1	札幌市中央区		2008-11-28
0640941	1	札幌市中央区	旭ケ丘	2008-11-28
0600041	1	札幌市中央区	大通東	2008-11-28
0600042	1	札幌市中央区	大通西(1〜19丁目)	2008-11-28
0640820	1	札幌市中央区	大通西(20〜28丁目)	2008-11-28
(略)
071101	47	八重山郡竹富町	竹富	2008-12-26
9071434	47	八重山郡竹富町	南風見	2008-12-26
9071433	47	八重山郡竹富町	南風見仲	2008-12-26
9071751	47	八重山郡竹富町	波照間	2008-12-26
9071544	47	八重山郡竹富町	鳩間	2008-12-26
9071800	47	八重山郡与那国町		2008-12-26
9071801	47	八重山郡与那国町	与那国	2008-12-26
検索/MapReduce
hive> SELECT z.zip, z.pref, z.city, z.town FROM zip z WHERE z.ver = '2008-12-26';
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201112190030_0001, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201112190030_0001
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201112190030_0001
2011-12-19 01:20:21,358 Stage-1 map = 0%,  reduce = 0%
2011-12-19 01:20:27,532 Stage-1 map = 100%,  reduce = 0%
2011-12-19 01:20:30,933 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201112190030_0001
OK
0600000	1	札幌市中央区	
0640941	1	札幌市中央区	旭ケ丘
0600041	1	札幌市中央区	大通東
0600042	1	札幌市中央区	大通西(1〜19丁目)
0640820	1	札幌市中央区	大通西(20〜28丁目)
0600031	1	札幌市中央区	北一条東
(略)
  • 条件を指定して検索
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
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201112190030_0002, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201112190030_0002
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201112190030_0002
2011-12-19 01:25:34,289 Stage-1 map = 0%,  reduce = 0%
2011-12-19 01:25:39,419 Stage-1 map = 100%,  reduce = 0%
2011-12-19 01:25:43,562 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201112190030_0002
OK
0691331	1	夕張郡長沼町	銀座
3220052	9	鹿沼市	銀座
3600032	11	熊谷市	銀座
3670052	11	本庄市	銀座
1040061	13	中央区	銀座
3940022	20	岡谷市	銀座
3950031	20	飯田市	銀座
4240817	22	静岡市清水区	銀座
4480845	23	刈谷市	銀座
7450032	35	周南市	銀座
7700916	36	徳島市	銀座
8040076	40	北九州市戸畑区	銀座
Time taken: 17.508 seconds
  • TableのJOIN
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
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapred.reduce.tasks=<number>
Starting Job = job_201112190030_0003, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201112190030_0003
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201112190030_0003
2011-12-19 01:27:54,253 Stage-1 map = 0%,  reduce = 0%
2011-12-19 01:28:06,828 Stage-1 map = 50%,  reduce = 0%
2011-12-19 01:28:08,983 Stage-1 map = 100%,  reduce = 0%
2011-12-19 01:28:25,878 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201112190030_0003
OK
0691331	北海道	夕張郡長沼町	銀座
3220052	栃木県	鹿沼市	銀座
3600032	埼玉県	熊谷市	銀座
3670052	埼玉県	本庄市	銀座
1040061	東京都	中央区	銀座
9300991	富山県	富山市	新庄銀座
3940022	長野県	岡谷市	銀座
3940023	長野県	岡谷市	東銀座
3950031	長野県	飯田市	銀座
4130013	静岡県	熱海市	銀座町
4240817	静岡県	静岡市清水区	銀座
4140028	静岡県	伊東市	銀座元町
4750874	愛知県	半田市	銀座本町
4480845	愛知県	刈谷市	銀座
5220088	滋賀県	彦根市	銀座町
6128089	京都府	京都市伏見区	銀座町
7450032	山口県	周南市	銀座
7450033	山口県	周南市	みなみ銀座
7700916	徳島県	徳島市	銀座
8040076	福岡県	北九州市戸畑区	銀座
Time taken: 43.692 seconds
SELECT結果をINSERT
  • 結果を格納するテーブルの定義
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: 0.175 seconds
  • SELECT結果を格納
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 '銀座';
Total MapReduce jobs = 2
Launching Job 1 out of 2
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201112190030_0004, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201112190030_0004
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201112190030_0004
2011-12-19 01:36:02,015 Stage-1 map = 0%,  reduce = 0%
2011-12-19 01:36:09,245 Stage-1 map = 100%,  reduce = 0%
2011-12-19 01:36:12,383 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201112190030_0004
Ended Job = -346086037, job is filtered out (removed at runtime).
Moving data to: hdfs://localhost/tmp/hive-yuta/hive_2011-12-19_01-35-54_464_2238504209915921606/-ext-10000
Loading data to table default.ginza_zip
Deleted hdfs://localhost/user/hive/warehouse/ginza_zip
Table default.ginza_zip stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 636]
20 Rows loaded to ginza_zip
OK
Time taken: 18.43 seconds
  • データの確認
hive> SELECT g.* FROM ginza_zip g;
OK
0691331	1	夕張郡長沼町	銀座
3220052	9	鹿沼市	銀座
3600032	11	熊谷市	銀座
3670052	11	本庄市	銀座
1040061	13	中央区	銀座
9300991	16	富山市	新庄銀座
3940022	20	岡谷市	銀座
3940023	20	岡谷市	東銀座
3950031	20	飯田市	銀座
4240817	22	静岡市清水区	銀座
4130013	22	熱海市	銀座町
4140028	22	伊東市	銀座元町
4750874	23	半田市	銀座本町
4480845	23	刈谷市	銀座
5220088	25	彦根市	銀座町
6128089	26	京都市伏見区	銀座町
7450032	35	周南市	銀座
7450033	35	周南市	みなみ銀座
7700916	36	徳島市	銀座
8040076	40	北九州市戸畑区	銀座
Time taken: 0.257 seconds
HDFSに結果を保存
hive> FROM zip z INSERT OVERWRITE DIRECTORY '/user/yuta/ginza'  SELECT z.zip, z.pref, z.city, z.town WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';
Total MapReduce jobs = 2
Launching Job 1 out of 2
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201112190030_0005, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201112190030_0005
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201112190030_0005
2011-12-19 01:45:36,429 Stage-1 map = 0%,  reduce = 0%
2011-12-19 01:45:43,743 Stage-1 map = 100%,  reduce = 0%
2011-12-19 01:45:47,863 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201112190030_0005
Ended Job = 897426408, job is filtered out (removed at runtime).
Moving data to: hdfs://localhost/tmp/hive-yuta/hive_2011-12-19_01-45-24_734_5088617359163695965/-ext-10000
Moving data to: /user/yuta/ginza
20 Rows loaded to /user/yuta/ginza
OK
Time taken: 23.314 seconds
  • HDFS上の結果を確認
$ hdfs -ls /user/yuta/ginza
Found 1 items
-rw-r--r--   1 yuta supergroup        636 2011-12-19 01:45 /user/yuta/ginza/000000_0

$ hdfs -cat /user/yuta/ginza/000000_0
06913311夕張郡長沼町銀座
32200529鹿沼市銀座
360003211熊谷市銀座
367005211本庄市銀座
104006113中央区銀座
930099116富山市新庄銀座
394002220岡谷市銀座
394002320岡谷市東銀座
395003120飯田市銀座
424081722静岡市清水区銀座
413001322熱海市銀座町
414002822伊東市銀座元町
475087423半田市銀座本町
448084523刈谷市銀座
522008825彦根市銀座町
612808926京都市伏見区銀座町
745003235周南市銀座
745003335周南市みなみ銀座
770091636徳島市銀座
804007640北九州市戸畑区銀座
ローカルファイルとして保存
  • ローカルファイルに保存
hive> FROM zip z INSERT OVERWRITE LOCAL DIRECTORY '/home/yuta/work/dev/hadoop/hive/localfiles/ginza'  SELECT z.zip, z.pref, z.city, z.town WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201112190030_0006, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201112190030_0006
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201112190030_0006
2011-12-19 01:51:56,101 Stage-1 map = 0%,  reduce = 0%
2011-12-19 01:52:03,369 Stage-1 map = 100%,  reduce = 0%
2011-12-19 01:52:08,816 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201112190030_0006
Copying data to local directory /home/yuta/work/dev/hadoop/hive/localfiles/ginza
Copying data to local directory /home/yuta/work/dev/hadoop/hive/localfiles/ginza
20 Rows loaded to /home/yuta/work/dev/hadoop/hive/localfiles/ginza
OK
Time taken: 19.987 seconds
  • 保存したファイルの確認
$ cat /home/yuta/work/dev/hadoop/hive/localfiles/ginza/000000_0 
06913311夕張郡長沼町銀座
32200529鹿沼市銀座
360003211熊谷市銀座
367005211本庄市銀座
104006113中央区銀座
930099116富山市新庄銀座
394002220岡谷市銀座
394002320岡谷市東銀座
395003120飯田市銀座
424081722静岡市清水区銀座
413001322熱海市銀座町
414002822伊東市銀座元町
475087423半田市銀座本町
448084523刈谷市銀座
522008825彦根市銀座町
612808926京都市伏見区銀座町
745003235周南市銀座
745003335周南市みなみ銀座
770091636徳島市銀座
804007640北九州市戸畑区銀座

まとめ

  • RDBのようにMapReduceをQLで操作できるのは魅力。(プログラミング言語MapReduceを書く必要がない。)
  • MapReduceした結果をHDFSやローカルファイルに落とす等比較的柔軟に利用ができる。
  • 今回は1台でしか試していないが、複数サーバに分散させた時の効果もちゃんと測定する必要がある。
  • hiveという単語で検索しても日本語のドキュメントが多く存在しないので、導入はこれからという感じか。