项目总目录:基于Hadoop的好友推荐系统项目综述
一、前端展示
1、jsp页面
<input class="easyui-validatebox" type="text"
id="group_input_id" data-options="required:true" style="width:300px"
value="WEB-INF/classes/centervector.dat" />
<a id="group_check_id" href="" class="easyui-linkbutton" data-options="iconCls:'icon-note'">查看</a>
<br><hr><br>
</div>
<div style="padding-left: 30px;font-size: 15px;padding-top:10px;"><br>
这里的数据不包括过滤的数据以及未分类的数据,即只包含已分类的数据<br>
</div>
<div id="group_return_id" style="padding-left: 30px;font-size: 20px;padding-top:10px;"></div>
jsp页面指定了数据的输入文件:WEB-INF/classes/centervector.dat
2、js逻辑
// group //查看聚类中心及占比
$('#group_check_id').bind('click', function(){
var input_i=$('#group2db_input_id').val();
// 弹出进度框
popupProgressbar('聚类中心','聚类中心解析中...',1000);
// ajax 异步提交任务
getCenterAndDisplay("cloud/cloud_groupcheck.action");
});
这里使用getCenterAndDisplay实现任务提交。
/**
* 获取中心点并展示
*
* @param url_
*/
function getCenterAndDisplay(url_){
$.ajax({
url : url_,
data: {},
async:true,
dataType:"json",
context : document.body,
success : function(data) {
closeProgressbar();
var retMsg;
if("true"==data.flag){
retMsg='操作成功!';
// 展示返回数据
$('#group_return_id').html(data.html);
}else{
retMsg='操作失败!失败原因:'+data.msg;
}
$.messager.show({
title : '提示',
msg : retMsg
});
}
});
}
二、后台实现
1、action层
对应的action从这里获取:getCenterAndDisplay(“cloud/cloud_groupcheck.action”);
/**
* 解析本地聚类中心数据,并获得数据库中分类数据占比情况
* 返回前台显示
*/
public void groupcheck(){
Map<String,Object> map = new HashMap<String,Object>();
List<String> centerVec=null;
List<String> percentVec=null;
try{
input = input==null ? HUtils.LOCALCENTERFILE:input;
centerVec= Utils.getLines(input);//获取聚类中心
percentVec= dBService.getPercent(centerVec.size());//计算各个聚类簇占总数的百分比
// 整合数据
StringBuffer buff = new StringBuffer();
buff.append("<br>");
for(int i=0;i<centerVec.size();i++){
buff.append("聚类中心:"+centerVec.get(i)+"\t,占比:"+percentVec.get(i)+"<br>");
}
map.put("html", buff.toString());
map.put("flag","true");
}catch(Exception e){
map.put("flag", "false");
map.put("msg", "解析聚类中心出错!");
e.printStackTrace();
}
Utils.write2PrintWriter(JSON.toJSONString(map));
return ;
}
2、获取聚类中心
Utils.getLines的定义如下:
/**
* 获得input的数据,每行作为一个字符串,全部数据放入list中
* @param input
* @return
* @throws IOException
*/
public static List<String> getLines(String input) throws IOException {
List<String> list = new ArrayList<String>();
input = Utils.getRootPathBasedPath(input);
FileReader reader = new FileReader(input);
BufferedReader br = new BufferedReader(reader);
String line = null;
while((line = br.readLine()) != null) {
list.add(line);
}
br.close();
reader.close();
return list;
}
3、计算百分比
/**
* 获取分类数据占比
*
* @param i
* @return
*/
public List<String> getPercent(int k) {
double[] percents = new double[k];
double sum = 0;
String hql = "select count(1) from UserGroup ug where ug.groupType=?";
for (int i = 0; i < k; i++) {
percents[i] = baseDao.count(hql, new Object[] { i + 1 });//查找属于聚类中心i的数据个数
sum += percents[i];//统计数据总数
}
List<String> list = new ArrayList<String>();
for (int i = 0; i < k; i++) {
list.add(Utils.obejct2Percent(percents[i] / sum, 2));// 计算每个聚类簇中数目的百分比,保留两位小数
}
return list;
}