这两天又开始看Mahout了,前面看了下 HBase,也都是一些浅尝辄止,因为要面试一个公司,所以就什么都看下。
今天看到了用Mysql数据库的数据作为Mahout的输入文件,觉得很高深的样子,所以就试试;
先贴代码:
package org.fansy.date902jdbc;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class MahoutJdbcOne {
/**
* use the MYSQL database as the input for MAHOUT
*
*/
public static void main(String[] args) throws TasteException {
// TODO Auto-generated method stub
long t1=System.currentTimeMillis();
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setServerName("localhost");
dataSource.setUser("fansy");
dataSource.setPassword("fansy");
dataSource.setDatabaseName("bookstore");
JDBCDataModel dataModel=new MySQLJDBCDataModel(dataSource,"mytable","uid","iid","val", "time");
// JDBCDataModel dataModel=new MySQLJDBCDataModel(dataSource,"mytable01","uid","iid","val",null);
DataModel model=dataModel;
UserSimilarity similarity=new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood=new NearestNUserNeighborhood(2,similarity,model);
Recommender recommender=new GenericUserBasedRecommender(model,neighborhood,similarity);
// the Recommender.recommend() method's arguments: first one is the user id;
// the second one is the number recommended
List<RecommendedItem> recommendations=recommender.recommend(1, 2);
for(RecommendedItem recommendation:recommendations){
System.out.println(recommendation);
}
System.out.println("done and time spend:"+(System.currentTimeMillis()-t1));
}
}
首先先在Mysql上建立一个表,见表sql脚本如下:
create table mytable(
uid varchar(50) not null ,
iid varchar(50) not null,
val varchar(50) not null,
time varchar(50) default null
)
导入的数据如下:
其实看 Mahout in Action上面看的不是很明白,上面说uid 和iid 都要定义为primary key, 但是在mysql中应该是只能一个为primary key 的,同时如果该字段被定义为primary key 的话,那么就不能重复了,不符合实际情况。
还有一点就是Mahout In Action 上面说的是
MySQLJDBCDataModel(dataSource,String tablename,String userid,String itemid,String value);
目前我用的版本是这样的:
MySQLJDBCDataModel(dataSource,String tablename,String userid,String itemid,String value,String timestamp);
应该是更新过了,那本书也是比较旧了,好像是09年的。
和刚开始用数据文件输入做了下对比,发现结果都是一样的,但是运行的时间使用数据库的要显劣势,这点和书上讲的一样。最后才发现这个简直和用java 连接数据库获得数据操作一样的,都是按照一定的格式来的,基本格式都一样,所以也不是那么高深了。
同时在操作Mysql时也复习了以前看的一些内容:
source <filename> -- 执行一个.sql文件
load data local infile '/home/fansy/mahout/data/intro.csv' replace into table mytable fields terminated by ',' lines terminated by '\n' (@col1,@col2,@col3) set uid=@col1,iid=@col2,val=@col3; -- 把一个文件中的数据导入到Mysql的表中
最近看的还是有点慢,英文版本的有些看的也不是很明白,只能是慢慢看了。