我有以下集合,其结构类似于:
student1 = {
"First_Name": "John",
"Last_Name": "Doe",
"Courses": [
{
"Course_Id": 123,
"Course_Name": "Computer Science",
"Has_Completed_Course" = true,
"Date_Of_Course_Completion" = Date("2019-12-15"),
"Modules" : [
{
"Module_Name" : "Operating Systems",
"Mark_Given" : 70
},
{
"Module_Name" : "Programming",
"Mark_Given" : 43
}
]
},
{
"Course_Id": 284,
"Course_Name": "Mathematics",
"Has_Completed_Course" = true,
"Date_Of_Course_Completion" = Date("2018-06-25"),
"Modules" : [
{
"Module_Name" : "Geometry",
"Mark_Given" : 55
},
{
"Module_Name" : "Algebra",
"Mark_Given" : 63
}
]
}
]
};
我想生成一个mapreduce,它返回在同一年完成同一课程并且平均分数大于50的学生数(仅适用于该课程的模块)。这是否可以在mapreduce中实现,或者对于这样的东西,聚合是否更容易,如果可以,如何实现?
如果有帮助的话,下面是我想以sql格式执行的操作:
SELECT Course_ID, Course_Name, YEAR, COUNT(Student_Id) AS Pass_Rate FROM
(
SELECT ctbs.Course_ID, EXTRACT(YEAR FROM ctbs.Date_Of_Course_Completion) YEAR, ctbs.Student_Id, Course_Name FROM tblModulesTakenByStudent mtbs
INNER JOIN tblCoursesTakenByStudent ctbs ON mtbs.Student_Id = ctbs.Student_Id
LEFT JOIN tblCourse c ON ctbs.Course_Id = c.Course_Id
WHERE ctbs.Has_Completed_Course = 'Y'
GROUP BY ctbs.Course_ID, Course_Name, EXTRACT(YEAR FROM Date_Of_Course_Completion), ctbs.Student_Id
HAVING AVG(Mark_Given) > 50
)
GROUP BY Course_Id, Course_Name, YEAR
ORDER BY Course_Id, Course_Name, YEAR;
我目前正在用mongodb在java实现中编写这个mapreduce,但是编写所需的函数而不使用java实现的任何细微差别也是可以的。
暂无答案!
目前还没有任何答案,快来回答吧!