いよいよ口コミデータを協調フィルタリングで処理してみる。
まずは、Hiveで作った入力データをHDFSに置く。(HDFS上のHiveの出力データそのままでもよかったのだけど)
$ hadoop fs -mkdir ldgourmet $ hadoop fs -put ldgourmet_ratings_for_ibr.csv ldgourmet
次に、下記のサイトのサンプルを参考に「Item-Based Recommendations」を実行。
Introduction to Item-Based Recommendations with Hadoop
$ mahout recommenditembased -s SIMILARITY_LOGLIKELIHOOD -i ldgourmet/ldgourmet_ratings_for_ibr.csv -o ldgourmet/output --numRecommendations 3 (省略) Error: java.lang.NumberFormatException: For input string: "ee02f26a" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:441) at java.lang.Long.parseLong(Long.java:483) at org.apache.mahout.cf.taste.hadoop.ToEntityPrefsMapper.map(ToEntityPrefsMapper.java:60) at org.apache.mahout.cf.taste.hadoop.ToEntityPrefsMapper.map(ToEntityPrefsMapper.java:30) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163) (省略) Exception in thread "main" java.io.FileNotFoundException: File does not exist: /user/take/temp/preparePreferenceMatrix/numUsers.bin at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:65) at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:55) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsUpdateTimes(FSNamesystem.java:1878) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsInt(FSNamesystem.java:1819) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1799) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1771) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getBlockLocations(NameNodeRpcServer.java:527) at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.getBlockLocations(AuthorizationProviderProxyClientProtocol.java:85) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getBlockLocations(ClientNamenodeProtocolServerSideTranslatorPB.java:356) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:587) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1026) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007) (省略)
エラーになった。
いくつかExceptionが出ているが、根本はユーザーIDのデータをlongに変換しようとしてエラーになっているのが原因と思われる。ていうか何故long?ユーザーIDが数値でなければならない理由が分からない。。。
よく分からないがGitHub上のRecommender.javaやItemBasedRecommender.javaあたりを見てみると確かにuserIDがlongになっている。でも理由は不明。
理由は不明だがとりあえずlongに変換したデータを作ってやってみる。
でも、今日はここまで。