问题描述:统计某个号码被哪些号码呼叫了
输入文件如下:
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);
}
}
分享到:
相关推荐
例如,当创建一个新的Java类时,模板可能会自动添加类的注释、作者信息、版权声明以及必要的构造函数、方法等。这样,开发者无需手动输入这些基本信息,从而节约了时间,减少了出错的可能性。 华为代码规范中强调的...
1、资源内容:基于hadoop实现维基百科词条倒排索引+源代码+文档说明+配置过程文档 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,功能...
网页模板是设计网页的一种快速而有效的方式,它们提供了一个预设的布局和设计,使得开发者或设计师无需从零开始创建整个页面。"经典网页模板(20套)"的资源集合,显然是一份包含了多种风格和用途的网页设计模板,...
CTeX 是 LaTeX 的一个扩展,它为中文排版提供了许多便利,包括字体选择、标点处理、中文排版规则等。下面将详细解释CTeX模板中的关键知识点,并结合描述提供的信息进行深入探讨。 1. **CTeX宏包**:CTeX 是 LaTeX ...
该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...
本资源是一个基于Java语言的源代码文件模板,总共六十页,每页五十行,主要涉及到嵌入式校园网网络质量监测系统的开发。以下是相关知识点的总结: 1. Java语言基础:该源代码文件模板使用Java语言编写,涉及到Java...
这包括前30页的前1500行代码和后30页的后1500行代码,每页展示50行,确保最后一页是一个完整的代码模块的结尾。为了达到每页50行的布局,你可以调整文档的页边距,设定为上、下2.2厘米,左、右2厘米,并在"页面设置...
1.codeFactory: Java代码生成,依赖rapid-generator.4.0.6.jar, 支持自定义模板生成代码, 弱业务下完全解放体力劳动. 2.ssm模板实现:pojo,dao,daoimpl,service,serviceimpl,controller,各mapper.xml 代码自动生成, 3....
4y4模板可能是指一个类似的服务或平台,提供多样化的网页设计模板供用户选择。对于这两个平台的用户来说,如果需要对模板进行深度定制或迁移至其他平台,就需要能够访问并操作其底层的HTML和CSS代码。 代码提取器的...
总结来说,"40套经典网页设计模板html模板"是一个宝贵的学习和参考资料,无论你是初学者还是经验丰富的设计师,都能从中获益。它们不仅可以帮助你快速搭建网站,还能激发你的创新思维,提升你的设计水平。通过深入...
6. **文件名称列表**:"32套VIP旺铺模板代码4"表明压缩包内包含了32个不同的模板代码文件,每个可能对应一个独立的设计主题或风格,商家可以根据自己的品牌形象和产品特性选择合适的模板进行应用。 通过下载并使用...
在"20个经典实用的网页模板"这个压缩包中,我们拥有一系列多样化的网页设计模板,这些模板适用于不同的应用场景,对于学习和实践Web前端技术来说极具价值。 首先,让我们深入了解Web前端开发的基本构成。Web前端...
【高仿sina微博个人微博html网页模板源代码】是一个针对新浪个人微博界面设计的HTML模板,它允许开发者或设计师创建一个与新浪微博界面风格类似的网页。这个模板可以帮助那些希望在自己的网站上实现类似微博功能的...
"家教网站一套很不错的模板"指的是一个专为家教服务设计的网页模板,旨在帮助创建高效、用户友好的在线教育平台。这个模板可能是由开发者在网上分享的,用于快速构建一个功能齐全的家教网站。 【模板特点】 1. **...
为MapReduce框架对电话号码的上行流量和下行流量及总流量进行统计的模板数据
总的来说,“108套经典网站模板”是一个强大的建站资源库,它集成了各种风格和功能的网站模版,涵盖了后台管理和企业展示等多种场景,无论你是新手还是经验丰富的开发者,都能从中受益。通过理解和运用这些模板,...
总的来说,这个模板项目旨在教授或演示如何使用HTML和CSS创建具有个性化主题(即“我的家乡”)的网页,并且强调了代码的规范性,对于初学者来说,是一个很好的学习实例,对于专业开发者而言,也是一个高效的工作...
一个有效的代码审查模板可以帮助审查者系统地检查代码,确保所有关键方面都得到评估。模板通常包括但不限于以下几个部分: 1. **代码结构**:检查代码是否遵循良好的编码规范,如命名约定、注释清晰、函数和类的...
每个mdb文件都是一个独立的Access数据库,下面将逐一解析这些模板的主要功能和知识点。 1. **产品订单.mdb**:这是一个针对销售管理的模板,包含产品目录、订单信息、客户数据等表。用户可以跟踪订单状态,管理库存...