読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

MahoutでDBをデータソースとして使用する その1

 隙間の時間でお試ししている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 + "=?");
  }

次回、何かサンプルソースを書こうと思います。