`

一个经典的MapReduce模板代码,倒排索引(ReverseIndex)

阅读更多
问题描述:统计某个号码被哪些号码呼叫了

输入文件如下:
13588888888 112
13678987879 13509098987
18987655436 110
2543789    112
15699807656 110
011-678987 112
说明:每一行为一条电话通话记录,左边的号码(记为a)打给右边的号码(记为b号码),中间用空格隔开

要求:
将以上文件以如下格式输出:
110 18987655436|15699807656
112 13588888888|011-678987
13509098987 13678987879
说明:左边为被呼叫的号码b,右边为呼叫b的号码a以"|"分割


解决思想很简单:Map中将a,b号码分割key为b,value为a写入context
Reduce中将values以"|"迭代分割

不多说(十二点了....),下面代码可在装有mapreduce插件的Eclipse中执行,也可先编译class文件,在打成jar包运行(代码中有提示,不过这对于初学者有些困难)不会的同学可以在下面评论,或加我QQ:1106373297,备注:hadoop学习

很经典的一段代码,哈哈
控制台输出结果:
........
/07/09 08:42:04 INFO mapred.JobClient:     Combine input records=0
14/07/09 08:42:04 INFO mapred.JobClient:     Reduce input records=5
14/07/09 08:42:04 INFO mapred.JobClient:     Reduce input groups=3
14/07/09 08:42:04 INFO mapred.JobClient:     Combine output records=0
14/07/09 08:42:04 INFO mapred.JobClient:     Physical memory (bytes) snapshot=0
14/07/09 08:42:04 INFO mapred.JobClient:     Reduce output records=5
14/07/09 08:42:04 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=0
14/07/09 08:42:04 INFO mapred.JobClient:     Map output records=5
任务名称:ReverseIndex
任务成功:是
输入行数:6
输出行数:5
跳过的行:1
任务开始:2014-07-09 08:41:55
任务结束:2014-07-09 08:42:04
任务耗时:0.15313333 分钟


import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;


public class ReverseIndex extends Configured implements Tool {


enum Counter {
LINESKIP, // 出错的行
}


public static class Map extends Mapper<LongWritable,Text,Text,Text> {
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString(); // 读取源数据
try{
// 数据处理
String[] lineSplit = line.split(" ");
String anum = lineSplit[0];
String bnum = lineSplit[1];
context.write(new Text(bnum), new Text(anum)); // 输出

} catch (java.lang.ArrayIndexOutOfBoundsException e) {
context.getCounter(Counter.LINESKIP).increment(1); // 出错hang计数器+1
return;
}
}
}


public static class Reduce extends Reducer {
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
String valueString;
String out = "";
for (Text value : values) {
valueString = value.toString();
out += valueString + "|";
System.out.println("Ruduce:key="+key+"  value="+value);
}
context.write(key, new Text(out));
}
}


@Override
public int run(String[] args) throws Exception {
Configuration conf = this.getConf();


Job job = new Job(conf, "ReverseIndex"); // 任务名
job.setJarByClass(ReverseIndex.class); // 指定Class

FileInputFormat.addInputPath(job, new Path(args[0])); // 输入路径
FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出路径

job.setMapperClass(Map.class); // 调用上面Map类作为Map任务代码
job.setReducerClass(ReverseIndex.Reduce.class); // 调用上面Reduce类作为Reduce任务代码

job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class); // 指定输出的KEY的格式
job.setOutputValueClass(Text.class); // 指定输出的VALUE的格式

job.waitForCompletion(true);

// 输出任务完成情况
System.out.println("任务名称:" + job.getJobName());
System.out.println("任务成功:" + (job.isSuccessful() ? "是" : "否"));
System.out.println("输入行数:"
+ job.getCounters()
.findCounter("org.apache.hadoop.mapred.Task$Counter",
"MAP_INPUT_RECORDS").getValue());
System.out.println("输出行数:"
+ job.getCounters()
.findCounter("org.apache.hadoop.mapred.Task$Counter",
"MAP_OUTPUT_RECORDS").getValue());
System.out.println("跳过的行:"
+ job.getCounters().findCounter(Counter.LINESKIP).getValue());


return job.isSuccessful() ? 0 : 1;
}


public static void main(String[] args) throws Exception {
// 判断参数个数是否正确
// 如果无参数运行则显示以作程序说明
if (args.length != 2) {
System.err.println("");
System.err.println("Usage: ReverseIndex < input path > < output path > ");
System.err
.println("Example: hadoop jar ~/ReverseIndex.jar hdfs://localhost:9000/in/telephone.txt hdfs://localhost:9000/out");


System.exit(-1);
}
// 记录开始时间
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = new Date();
// 运行任务
int res = ToolRunner.run(new Configuration(), new ReverseIndex(), args);


// 输出任务耗时
Date end = new Date();
float time = (float) ((end.getTime() - start.getTime()) / 60000.0);
System.out.println("任务开始:" + formatter.format(start));
System.out.println("任务结束:" + formatter.format(end));
System.out.println("任务耗时:" + String.valueOf(time) + " 分钟");


System.exit(res);
}
}
0
0
分享到:
评论

相关推荐

    华为代码规范代码模板

    例如,当创建一个新的Java类时,模板可能会自动添加类的注释、作者信息、版权声明以及必要的构造函数、方法等。这样,开发者无需手动输入这些基本信息,从而节约了时间,减少了出错的可能性。 华为代码规范中强调的...

    基于hadoop实现的维基百科词条倒排索引+源代码+文档说明+配置过程文档

    1、资源内容:基于hadoop实现维基百科词条倒排索引+源代码+文档说明+配置过程文档 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,功能...

    经典网页模板(20套)

    网页模板是设计网页的一种快速而有效的方式,它们提供了一个预设的布局和设计,使得开发者或设计师无需从零开始创建整个页面。"经典网页模板(20套)"的资源集合,显然是一份包含了多种风格和用途的网页设计模板,...

    html源代码网页模板文件

    它们提供了一个基础,开发者可以根据自己的需求进行修改和扩展,以快速创建符合自己品牌和功能的网站。 在使用HTML源代码网页模板时,开发者需要了解并理解模板中的各个部分,然后根据项目需求进行调整。这可能包括...

    软著申请:源代码文件模板,每页五十行,一共六十页

    本资源是一个基于Java语言的源代码文件模板,总共六十页,每页五十行,主要涉及到嵌入式校园网网络质量监测系统的开发。以下是相关知识点的总结: 1. Java语言基础:该源代码文件模板使用Java语言编写,涉及到Java...

    基于hadoop和spark建立的倒排索引+源代码+文档说明

    该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! &lt;项目介绍&gt; 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...

    软著-源代码模板202004.docx

    随着科技的快速发展,软件的创造和更新变得日益频繁,软件著作权作为保障软件开发者权益的法律工具,其重要性...随着中国软件行业的不断进步,规范的版权保护措施将继续发挥其重要角色,维护一个公平、有序的创新环境。

    网站后台模板方便使用-27个经典代码

    综上所述,"网站后台模板方便使用-27个经典代码"可能涵盖了以上提及的多个方面,旨在提供一套完整的后台开发解决方案,帮助开发者高效构建出功能完备、易于维护的后台系统。在实际应用中,开发者可以根据项目需求...

    动软代码生成器C#连接mysql三层代码模板--修改版

    动软代码生成器 V2.76版,请支持正版。 修改DAL.cmt模板文件: 1、必须增加该命名空间 using MySql.Data.MySqlClient;...7、模板代码批量生成,可直接生成相应表代码,复制到项目中,直接调用 BLL部分,实现增删改查。

    微信公众号模板消息推送代码

    微信公众号模板消息推送代码,亲测可行。其中有一个工具类,注释啥的都有。需要的可以看看

    系统源代码说明书-模板.docx

    本文档模板提供了一个基本结构,涵盖了系统源代码的各个方面,包括文档目标、名词术语、目标读者、参考资料、工程规范、代码规范、开发规范、工程代码目录、后端工程、前端工程、工程配置信息等内容。 文档目标 ...

    世界500强Excel经典图表模板(完整版)

    综上所述,"世界500强Excel经典图表模板(完整版)"是一个宝贵的资源,它不仅提供了丰富的图表示例,还体现了数据分析和数据可视化的前沿实践。掌握这些知识,无论是在日常工作中还是在面试中,都能够展现出强大的...

    40套经典网页设计模板html模板

    总结来说,"40套经典网页设计模板html模板"是一个宝贵的学习和参考资料,无论你是初学者还是经验丰富的设计师,都能从中获益。它们不仅可以帮助你快速搭建网站,还能激发你的创新思维,提升你的设计水平。通过深入...

    div+css网页布局设计模板源代码

    - **Free-Science-Website-Template.zip**:这可能是一个免费的科学类网站模板,适合科技、研究或教育类站点,可能包含相关图标、图表和颜色方案。 - **wing-the-air.zip**:可能是一个与飞行或旅行相关的模板,...

    淘宝装修_32套VIP旺铺模板代码4

    6. **文件名称列表**:"32套VIP旺铺模板代码4"表明压缩包内包含了32个不同的模板代码文件,每个可能对应一个独立的设计主题或风格,商家可以根据自己的品牌形象和产品特性选择合适的模板进行应用。 通过下载并使用...

    20个经典实用的网页模板

    在"20个经典实用的网页模板"这个压缩包中,我们拥有一系列多样化的网页设计模板,这些模板适用于不同的应用场景,对于学习和实践Web前端技术来说极具价值。 首先,让我们深入了解Web前端开发的基本构成。Web前端...

    20套经典网站模板

    使用这些经典网站模板,你可以快速启动一个新的项目,无论是创建个人博客、企业网站还是电子商务平台。每个模板都包含了完整的文件结构,包括CSS样式表(用于控制外观)、JavaScript文件(用于交互功能)以及图像和...

    经典网站模板_100套

    网站模板是预先设计好的网页布局和样式,可以帮助开发者快速构建一个具有专业外观的网站,而无需从零开始进行设计。这种模板通常包括HTML、CSS和JavaScript等元素,有时也会包含图像、图标和其他视觉元素。 1. **...

    eclipse代码格式化模板和注释格式化模板

    Eclipse是一款广泛使用的Java集成开发环境(IDE),它提供了丰富的功能,包括代码编辑、调试、构建和重构等。在编写代码的过程中,保持代码整洁、规范是至关重要的,这有助于提高代码可读性和团队协作效率。Eclipse ...

Global site tag (gtag.js) - Google Analytics