MahoutはHadoop Map/Reduce上※で動作する機会学習のフレームワークです。例えばユーザーと購入した商品の評価からレコメンド(推奨)をするプログラムをJavaで書くと、とても複雑なプログラムになりますが、Mahoutを使うとコマンド一つで実行できます。
※Map/Reduce以外でも動作します。
例えば次のようなデータを入力値とします。
Jonathan,Hadoop,3.0
Jonathan,Linux,2.5
Jonathan,Java,5.0
Joseph,Hadoop,4.2
Joseph,Linux,4.8
Joseph,Java,3.0
Jotaro,Hadoop,3.0
Jotaro,Linux,4.2
※セミナーの受講者と評価の情報です。項目は右から(受講者,クラス,評価)を表します。
しかしここで問題があります。Mahout 0.7のレコメンデーションは、一つ目と二つ目のフィールドが数値形式でなくてはなりません。そこで、まずはMahoutが扱える形式に変換する必要がありますが、ここでHiveを使うと簡単です。
Hiveは本来はJavaなどのプログラミング言語で記述するMap/ReduceをHiveQLというSQLに似た独自言語で実装するためのものです。それでは前述のデータをHiveに取り込んでみます。
まずhiveシェルを起動する前に、次のコマンドを実行しておきます。
export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib
※実行しておかないと、row_sequence関数を使うとエラーになります。
hiveシェルを起動し、以下のコマンドを実行します。
hive> create table trainee_list(tname string, cname string, score double)
> row format delimited
> fields terminated by ',';
OK
Time taken: 6.173 seconds
hive> load data local inpath './trainee_list'
> into table trainee_list;
Copying data from file:/Users/masahiro/trainee_list
Copying file: file:/Users/masahiro/trainee_list
Loading data to table default.trainee_list
OK
Time taken: 0.684 seconds
hive> select * from trainee_list;
OK
Jonathan Hadoop 3.0
Jonathan Linux 2.5
Jonathan Java 5.0
Joseph Hadoop 4.2
Joseph Linux 4.8
Joseph Java 3.0
Jotaro Hadoop 3.0
Jotaro Linux 4.2
Time taken: 0.341 seconds
これで、Hiveのテーブルにデータを取り込むことが出来ました。なお、テーブルのデータはHDFS(/user/hive/warehouse以下)に格納されています。次に、このデータから受講者マスタとクラスマスタのテーブルを作成します。
これ以降の処理でrow_sequence関数を使います。row_sequence関数を有効にするために、以下のコマンドを実行します。
hive> set mapred.reduce.tasks=1;
hive> create temporary function row_sequence as
> 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';
OK
Time taken: 0.0090 seconds
なお、上記2つのコマンドはhiveシェルにログインするたびに必要なようです。
次に、受講者マスタテーブルを作成するために、以下のコマンドを実行します。
hive> create table trainee_master
> row format delimited
> fields terminated by ','
> as select row_sequence() as id, tname as name
> from trainee_list
> group by tname;
・・・省略・・・
OK
Time taken: 29.581 seconds
hive> select * from trainee_master;
OK
1 Jonathan
2 Joseph
3 Jotaro
Time taken: 0.089 seconds
同様にクラスマスタの方も作成します。
hive> create table class_master
> row format delimited
> fields terminated by ','
> as select row_sequence() as id, cname as name
> from trainee_list
> group by cname;
・・・省略・・・
OK
Time taken: 22.834 seconds
hive> select * from class_master;
OK
1 Hadoop
2 Java
3 Linux
※LinuxとJavaの順番が入れ替わってしまいました(汗)
最後にこれらのデータを使って、Mahoutのインプットデータを作成します。
hive> create table mahout_input
> row format delimited
> fields terminated by ','
> as select tm.id as tid, cm.id as cid, tl.score as score
> from trainee_list tl join trainee_master tm
> on tl.tname=tm.name
> join class_master cm
> on tl.cname=cm.name
> sort by tid,cid;
・・・省略・・・
OK
Time taken: 76.213 seconds
hive> select * from mahout_input;
OK
1 1 3.0
1 2 5.0
1 3 2.5
2 1 4.2
2 2 3.0
2 3 4.8
3 1 3.0
3 3 4.2
Time taken: 0.074 seconds
これでMahoutのインプットデータが完成しました。ちなみに、今回は見やすくするためにソートを使いましたが、処理が遅くなるので実際には使わない方がいいと思います。
次回はこのデータをもとに、レコメンドをしていきます。
0 件のコメント:
コメントを投稿