隙間の時間でお試ししているMahout。遅々として進みませんが、まぁ気長に。
今回は、データソースをファイルからデータベースに変更して動かそうとしました。Mahoutの実装を見ると、インターフェースとしてorg.apache.mahout.cf.taste.modelの下にJDBCDataModelというのがあります。そのimplとして、org.apache.mahout.cf.taste.impl.model.jdbcの下に、AbstractJDBCDataModel,ConnectionPoolDataSource,GenericJDBCDataModel,MySQLJDBCDataModelがありました。抽象クラスを元に各DBの実装を作っていくというお決まりのパターンのようです。ドキュメントを読んでみるとMySQL用のモデルを作っておくから、他のデータベースで使う場合は自分で作ってねとのことです。まぁ、これはそのうち充実してくるでしょう。
次に、MySQLJDBCDataModelを読んでいたのですが、割と簡単そうです。肝になる部分だけ下にピックアップしますが、引数として対象のテーブルとユーザID、アイテムID、バリュー値のカラムを指定すれば良いようです。割と簡単そうですね。
/** * <p>Creates a {@link MySQLJDBCDataModel} using the given {@link DataSource} * and default table/column names.</p> * * @param dataSource {@link DataSource} to use * @param preferenceTable name of table containing preference data * @param userIDColumn user ID column name * @param itemIDColumn item ID column name * @param preferenceColumn preference column name */ public MySQLJDBCDataModel(DataSource dataSource, String preferenceTable, String userIDColumn, String itemIDColumn, String preferenceColumn) { super(dataSource, preferenceTable, userIDColumn, itemIDColumn, preferenceColumn, // getUserSQL "SELECT " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable + " WHERE " + userIDColumn + "=? ORDER BY " + itemIDColumn, // getNumItemsSQL "SELECT COUNT(DISTINCT " + itemIDColumn + ") FROM " + preferenceTable, // getNumUsersSQL "SELECT COUNT(DISTINCT " + userIDColumn + ") FROM " + preferenceTable, // setPreferenceSQL "INSERT INTO " + preferenceTable + '(' + userIDColumn + ',' + itemIDColumn + ',' + preferenceColumn + ") VALUES (?,?,?) ON DUPLICATE KEY UPDATE " + preferenceColumn + "=?", // removePreference SQL "DELETE FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND " + itemIDColumn + "=?", // getUsersSQL "SELECT " + itemIDColumn + ", " + preferenceColumn + ", " + userIDColumn + " FROM " + preferenceTable + " ORDER BY " + userIDColumn + ", " + itemIDColumn, // getItemsSQL "SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " ORDER BY " + itemIDColumn, // getItemSQL "SELECT 1 FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?", // getPrefsForItemSQL "SELECT " + preferenceColumn + ", " + userIDColumn + " FROM " + preferenceTable + " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn, // getNumPreferenceForItemSQL "SELECT COUNT(1) FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?", // getNumPreferenceForItemsSQL "SELECT COUNT(1) FROM " + preferenceTable + " tp1 INNER JOIN " + preferenceColumn + " tp2 " + "ON (tp1." + userIDColumn + "=tp2." + userIDColumn + ") " + "WHERE tp1." + itemIDColumn + "=? and tp2." + itemIDColumn + "=?"); }
次回、何かサンプルソースを書こうと思います。