2012-07-24 43 views
1

我有一个功能正常的推荐程序,我希望使其更快,因此我决定将其直接连接到我的数据库。但是,每当我尝试向人们推荐某些东西时,我都会收到一个错误setFetchSize() is not >=0。这里是我的代码:如何解决建议使用Mahout在SetFetchSize()上失败

MySQLJDBCDataModel dataModel = null; 
try { 
    Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
    net.sourceforge.jtds.jdbcx.JtdsDataSource ds = new net.sourceforge.jtds.jdbcx.JtdsDataSource(); 
    ds.setServerName("xxxxx"); 
    ds.setDatabaseName("xxxxx"); 
    ds.setUser("xxxxx"); 
    ds.setPassword(xxxxx); 
    ds.setDomain("xxxxx"); 
    //net.sourceforge.jtds.jdbc.JtdsStatement.setFetchSize(10); 
    dataModel = new MySQLJDBCDataModel(ds, "test_tbl", "user_id", "item_id", "preference", null); 
} catch (Exception e) { 
    System.out.println("can't connect"); 
} 
ArrayList<String> itemList=new ArrayList<String>(); 
ItemSimilarity similarity = new FileItemSimilarity(new File("output/part-r-00000")); 
ItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, similarity); 
//List<RecommendedItem> recommendedItems=recommender.recommend(userid,10); 
Recommender cachingRecommender = new CachingRecommender(recommender); 
List<userRecData> allUserRecs = new ArrayList<userRecData>(); 
List<RecommendedItem> uRec=cachingRecommender.recommend(userobjectid,10); 

而我得到的错误:

java.sql.SQLException: The setFetchSize method requires a parameter value >= 0. 
at net.sourceforge.jtds.jdbc.JtdsStatement.setFetchSize(JtdsStatement.java:998) 
at org.apache.mahout.cf.taste.impl.model.jdbc.AbstractJDBCDataModel.getNumThings(AbstractJDBCDataModel.java:584) 
at org.apache.mahout.cf.taste.impl.model.jdbc.AbstractJDBCDataModel.getNumUsers(AbstractJDBCDataModel.java:560) 
at org.apache.mahout.cf.taste.impl.recommender.CachingRecommender.<init>(CachingRecommender.java:63) 
at mia.recommender.RecommenderIntro.getRecommendations(RecommenderIntro.java:79) 
at mia.recommender.RecommenderIntro.main(RecommenderIntro.java:43) 

它未能在cachingRecommender,或者如果我参加了这一点,在recommnder.recommend 我自动认为亨利马乌将获取大小设置为1000

回答

1

您正在使用MySQLJDBCDataModel,但您的数据库是SQL Server。 MySQL实现会禁用具有负值的提取大小,因为其驱动程序需要该值。您需要自定义AbstractJDBCDataModel以使用SQL Server - 例如,不要覆盖getFetchSize()

相关问题