2012年12月10日月曜日

Mahoutでレコメンデーション(2)〜レコメンド→レポート作成編



Mahoutでレコメンデーションの後半です。前半ではMahoutの入力データを作成しました。それでは、Mahoutでレコメンデーションを実行してみます。以下のコマンドを実行します。
MasahiroPC:~ masahiro$ mahout recommenditembased -n 1 --input /user/hive/warehouse/mahout_input/000000_0 --output /user/hive/warehouse/mahout_output
ちなみに上記コマンドを実行すると、一時ファイルを格納するためのtempディレクトリをHDFSのホームディレクトリに作成します。再度Mahoutコマンドを実行する際には、このディレクトリを削除してからでないとエラーを返すのでご注意ください。

Map/Reduceの処理が終わったら、出力ファイルを確認します。
MasahiroPC:~ masahiro$ hadoop fs -cat /user/hive/warehouse/mahout_output/part-r-00000
・・・省略・・・
3 [2:3.6]


これは、受講者3番には2番のクラスがおすすめで、2番のクラスを受講すると3.6の評価をするであろう、ということを表しています。

ただし、ここで一つ問題があります。HiveQLのCREATE TABLE文では、どうやらフィールドの区切り文字は一種類しか指定できないようです。

そこで、とりあえず次のようなテーブルを作成します。
hive> create table temp_result(c1 int, c2 string)
    > row format delimited fields terminated by '\t';
OK
Time taken: 0.183 seconds
hive> load data inpath '/user/hive/warehouse/mahout_output/part-r-00000' 
    > into table temp_result;                                            
Loading data to table default.temp_result
OK
Time taken: 0.891 seconds
hive> select * from temp_result;
OK
3 [2:3.6]
Time taken: 0.067 seconds


次に、length関数とsubstr関数を使って、以下の文を実行します。
hive> create table temp_result2
    > row format delimited fields terminated by ','
    > as select c1 as tid,substr(c2,2,length(c2) - 6) as cid ,substr(c2,4,3)  as score from temp_result;
・・・省略・・・
OK
Time taken: 12.82 seconds
hive> select * from temp_result2;
OK
3 2 3.6
Time taken: 0.069 seconds



これで出力結果のフォーマットを表の形式に整えることが出来ました。最後に各マスターと結合します。
hive> create table result
    > as select tm.name as tname , cm.name as cname, tr.score as score
    > from temp_result2 tr join trainee_master tm
    > on tr.tid = tm.id
    > join class_master cm
    > on tr.cid = cm.id;
・・・省略・・・
OK
Time taken: 46.829 seconds
hive> select * from result;
OK
Jotaro Java 3.6
Time taken: 0.074 seconds



以上です。あとはこの出力結果をRDBなり、HBaseなりに登録しておけば、訪問者にお勧めとして提示することが可能です。他にも色々なやり方があるので、もっと効率のいい方法があるかもしれません。

補足
 あとで分かったんですが、instr関数がありました(汗)これを使えばもう少し、スマートなコードを書けそうです。


0 件のコメント:

コメントを投稿