MapReduce处理数据(用户每周登录次数)

数据格式如下:
{
  "_id" : 9040001,
  "username" : "shao1",
  "cityId" : 320200,
  "versionVal" : NumberLong("210000200000"),
  "loginInIP" : "192.168.2.7",
  "logoutTime" : new Date("1/9/2014 21:01:00"),
  "hardwareCodes" : "76332f9bafe7aff580e47e42df07e5c7",
  "addTime" : new Date("1/9/2014 20:01:00"),
  "isLegalCopy" : 1,
  "enterpriseId" : 0,
  "loginTime" : new Date("1/9/2014 20:01:00"),
  "logId" : "078EF19407AC4798882A7587B358B517",
  "logType" : 1,
  "loginOutIP" : "192.168.2.7",
  "version" : "25.1.0",
  "userIdentityIds" : -1,
  "provinceId" : 320000,
  "productId" : 3
}




-------------------------------------------------


需求:统计出每个用户每周的登陆次数


-------------------------------------------------
function Map() {
//获取时间所在年份的周数
var getWeekNumOfYear = function(date) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
beginDay = new Date(year, 0, 1);
var weekDay = beginDay.getDay();
if (weekDay == 6) {
beginDay = new Date(year, 0, 7);
} else {
beginDay = new Date(year, 0, 6 - weekDay);
}

today = new Date(year, parseInt(month) - 1, day);
var weekNum = Math.ceil(((today - beginDay) / 86400000) / 7);
if (today.getDay() == 6 ) {
weekNum = weekNum - 1;
}
if (today.getDay() == 0) {
weekNum = weekNum - 1;
}
return weekNum;
};


//获取时间所在周数的开始时间
var getWeekStartDate =function (date) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var weekDay;
today = new Date();
today.setFullYear(year, month - 1, day);
weekDay = today.getDay();
if(weekDay ==0 ){
weekDay = 7;
}
if (weekDay == 1) {
today.setDate(today.getDate());
} else{
today.setDate(today.getDate() - weekDay + 1);
}
return new Date(today.getFullYear() + "/" + (today.getMonth() + 1) + "/" + today.getDate() +" 00:00:00");

};


//获取时间所在周数的结束时间
var getWeekEndDate = function (date) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var weekDay;
today = new Date();
today.setFullYear(year, month - 1, day);
weekDay = today.getDay();
if (weekDay == 0) {
today.setDate(today.getDate());
} else {
today.setDate(today.getDate() - weekDay + 7);
}

return new Date(today.getFullYear() + "/" + (today.getMonth() + 1) + "/" + today.getDate() +" 23:23:59");

};

//获取时间的年份
var year = function(date){return date.getFullYear();};
var week = getWeekNumOfYear(this.loginTime);
//用户名+年份+周数组成唯一标识
var key =  this.username +"|"+ year(this.loginTime) +"|"+ week;


emit(
key,{"un":this.username,"year":year(this.loginTime),
"week":week,"count":1,"st":getWeekStartDate(this.loginTime),"et":getWeekEndDate(this.loginTime)}
); 

}






function Reduce(key, values) {
var reduce = {"un":"","year":0,"week":0,"count":0,"st":new Date(),"et":new Date()};
for(var i in values){
 reduce.un = values[i].un;
 reduce.year = values[i].year;
 reduce.week = values[i].week;
 reduce.st = values[i].st;
 reduce.et = values[i].et;
 //相同的数据累加登陆次数
 if((reduce.un == values[i].un)&& (reduce.year == values[i].year)&& (reduce.week == values[i].week)){
    reduce.count = values[i].count + reduce.count;
 }
}
return reduce;
}


----------------------------------------------------------
聚合出来的数据
{
  "_id" : "0_fairy|2013|0",
  "value" : {
    "username" : "0_fairy",
    "year" : 2013.0,
    "week" : 0.0,
    "count" : 1.0,
    "startDate" : new Date("31/12/2012 00:00:00"),
    "endDate" : new Date("6/1/2013 23:23:59")
  }
}
------------------------------------------------------------


查询:
{
"value.username":"0_fairy",
"value.startDate":{$gte:new Date("2012-12-31 00:00:00")},
"value.endDate":{$lte:new Date("2014-8-31 23:23:59")}
"value.count":{$gte:1}
}
有数据则说明此用户是活跃用户。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值