如何在MapReduce中解决TOP'n'FOR'每个'实体'?

时间:2015-04-21 23:50:36

标签: java hadoop mapreduce bigdata

我是Hadoop / MR世界的新手,并尝试解决以下问题:

一所大学正试图在过去20年中根据它的受欢迎程度找到它提供的前20名科目。该计划应通过计算每个校区的独特学生的访问次数来找出前20个科目。理想的输出应该是这样的:

Campus1 Mathes:3500 Law:3200 JavaProg:2830 Anatomy:2701 ...
Campus2 DB:4200 Chamistry:4190 Business:3999 Astronomy:3500 ...
Campus3 C/C++:2800 Python:2799 BigData:1900 WebDev:1200 ...
...
...

有两个文件包含不同但相关的数据集:

subjects.txt & students.txt

subjects.txt包含有关主题和学生ID的所有信息,其中包含详细信息students.txt文件,这意味着要将文件内部连接以查找受欢迎程度。

因为这涉及多个文件和多个MR作业,这些作业将被链接。请提供有关如何为此问题实施解决方案的建议。

****编辑:****

Subject.txt:

Subj_id \t Subj_name \t Location_offered \t Stdnt_id \t Semstr_offered \t Instructor_id

Student.txt:

stdnt_id \t stdnt_name \t dob \t campus \t year_of_start

1 个答案:

答案 0 :(得分:1)

我认为你必须根据学院每个校区的学生访问次数找出前20名科目。

如果是,那么必需的字段将是提供的位置,subj_name,stdnt_id。这三列足以得出预期的结果。因此,您只能使用subjects.txt并跳过加入过程。

第1阶段:

在此作业中,处理与wordcount类似。从subject.txt文件解析校园ID,主题id,并通过汇总caumpus id和subject id创建密钥,并将1作为值。在每个键的reducer处执行所有值的总和。

此阶段的结果将是

campus1&数学:3500

campus2& Chemistry:4190

campus1& Law:3200 .......

此结果包含每个校园中每个科目的访问次数,但无序。

第2阶段: -

在此阶段,使用二级排序仅为每个校园发出前20条记录。

使用Campus_id,主题ID和访问次数创建复合键。创建排序比较器和分区器以使用园区ID并创建分组比较器,以按降序对访问计数的键进行排序。

在reducer方法中使用一个增量变量最多20并发出结果。在20次迭代后从循环退出一次。在这20次迭代中,准备一个String或任何数组来表示有关校园/主题/访问的详细信息结果发出。

请参阅http://codingjunkie.net/secondary-sort/进行二次排序。