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