mapreduce编程实例(6)-求TOP 10

本文通过MapReduce实现了一个案例,旨在找出网站会员中积分最高的前10位用户。程序利用XML文件作为输入数据,并在map阶段采用自定义的cleanup函数和TreeMap数据结构,TreeMap保证了数据按积分自动排序,当元素数量超过10时,移除最小值以保持Top 10的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网站会员中,会员积分不同。此程序是求Reputation最高的10个用户。用的测试文件为users.xml(见本系列第一节云盘地址)

代码如下

package mrdp.ch3;

import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;

import mrdp.utils.MRDPUtils;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class TopTenDriver {

	public static class SOTopTenMapper extends
			Mapper<Object, Text, NullWritable, Text> {
		// Our output key and value Writables
		private TreeMap<Integer, Text> repToRecordMap = new TreeMap<Integer, Text>();

		@Override
		public void
### MapReduce编程组件的使用说明 MapReduce是一种分布式计算框架,用于大规模数据集的行处理。其核心由五个主要编程组件构成:`InputFormat`、`Mapper`、`Partitioner`、`Reducer` 和 `OutputFormat`[^1]。 #### InputFormat 该组件定义了输入数据如何被分割成多个片段(split),以及这些片段如何转换为键值对的形式供后续处理。通常情况下,默认实现已经能够满足大多数需,因此开发者无需额外定制此部分。 #### Mapper Mapper负责具体的数据处理逻辑。对于每一组键值对,都会调用一次`map()`方法来完成相应的操作。在实际应用中,比如经典的词频统计场景,可以通过自定义Mapper类中的`map()`函数实现逐行读文本文件,将其拆分为单词作为新的键值对输出[^3][^4]。 以下是基于Java的一个简单示例代码展示如何构建一个基本的Mapper: ```java public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line.toLowerCase()); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } ``` #### Partitioner 分区器决定了中间结果中的键应该发送给哪个Reducer实例进行进一步聚合运算。如果未特别设置,则采用哈希算法均匀分配各个记录至不同的reducer节点上。 #### Reducer 接收来自mapper端产生的相同key的所有values集合之后再做最后一步汇总工作。同样以wordcount为例来说就是把同一个词语出现次数加总起来形成最终的结果形式返回出去. 下面给出一段关于reduce过程的具体实现: ```java public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> { public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException ,InterruptedException{ int sum=0; for(IntWritable val : values){ sum +=val.get(); } context.write(key,new IntWritable(sum)); } } ``` #### OutputFormat 它规定了作业完成后所产生的输出应当怎样存储下来;就像前面提到过的那样如果没有特殊要的话那么就按照既定模式来进行保存就可以了。 通过上述介绍可以看出整个流程大致可以概括如下几个方面: - 数据源加载(`InputFormat`) - 初步解析与转化(`Mapper`) - 中间产物重新分布安排(`Partitioner`) -与总结(`Reducer`) - 结果持久化储存(`OutputFormat`) 为了便于理解和实践这里还列举了一些常见的应用场景及其对应的解决方案链接[^2]: - **单词计数**: 这是最基础也是最典型的例子之一. - **倒排索引建设** - **去除重复项** - **获最高频率条目(Top N)**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值