转自:http://rangerwolf.iteye.com/blog/2119096

题外话:

《Hadoop in Action》 是一本非常不错的交Hadoop的入门书,而且建议看英文版。此书作者的英文表达非常简单易懂。相信有一定英文阅读能力的同学直接用英文版就能非常容易的上手~

进入正题。 这个题目是《Hadoop in Action》 上面的一道题目,求出Top K的值。

我自己随便弄了一个输入文件:

  1. g   445
  2. a   1117
  3. b   222
  4. c   333
  5. d   444
  6. e   123
  7. f   345
  8. h   456

讲讲我的思路:

对于Top K的问题,首先要在每个block/分片之中找到这部分的Top K。并且由于只能输出一次,所以输出的工作需要在cleanup方法之中进行。为了简单,使用的是java之中的TreeMap,因为这个数据结构天生就带有排序功能。 而Reducer的工作流程跟Map其实是完全一致的,只是光Map一步还不够,所以只能再加一个Reduce步骤。

最终输出的格式为如下:(K=2)

  1. 1117    a
  2. 456    g

所以需要使用map。 如果只需要输出大小的话,直接使用TreeSet会更高效一点。

下面是实现的代码:

  1. package hadoop_in_action_exersice;
  2. import java.io.IOException;
  3. import java.util.TreeMap;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.LongWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;
  10. import org.apache.hadoop.mapreduce.Mapper;
  11. import org.apache.hadoop.mapreduce.Reducer;
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  13. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  14. public class TopK {
  15. public static final int K = 2;
  16. public static class KMap extends Mapper<LongWritable, Text, IntWritable, Text> {
  17. TreeMap<Integer, String> map = new TreeMap<Integer, String>();
  18. public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  19. String line = value.toString();
  20. if(line.trim().length() > 0 && line.indexOf("\t") != -1) {
  21. String[] arr = line.split("\t", 2);
  22. String name = arr[0];
  23. Integer num = Integer.parseInt(arr[1]);
  24. map.put(num, name);
  25. if(map.size() > K) {
  26. map.remove(map.firstKey());
  27. }
  28. }
  29. }
  30. @Override
  31. protected void cleanup(
  32. Mapper<LongWritable, Text, IntWritable, Text>.Context context)
  33. throws IOException, InterruptedException {
  34. for(Integer num : map.keySet()) {
  35. context.write(new IntWritable(num), new Text(map.get(num)));
  36. }
  37. }
  38. }
  39. public static class KReduce extends Reducer<IntWritable, Text, IntWritable, Text> {
  40. TreeMap<Integer, String> map = new TreeMap<Integer, String>();
  41. public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  42. map.put(key.get(), values.iterator().next().toString());
  43. if(map.size() > K) {
  44. map.remove(map.firstKey());
  45. }
  46. }
  47. @Override
  48. protected void cleanup(
  49. Reducer<IntWritable, Text, IntWritable, Text>.Context context)
  50. throws IOException, InterruptedException {
  51. for(Integer num : map.keySet()) {
  52. context.write(new IntWritable(num), new Text(map.get(num)));
  53. }
  54. }
  55. }
  56. public static void main(String[] args) {
  57. // TODO Auto-generated method stub
  58. Configuration conf = new Configuration();
  59. try {
  60. Job job = new Job(conf, "my own word count");
  61. job.setJarByClass(TopK.class);
  62. job.setMapperClass(KMap.class);
  63. job.setCombinerClass(KReduce.class);
  64. job.setReducerClass(KReduce.class);
  65. job.setOutputKeyClass(IntWritable.class);
  66. job.setOutputValueClass(Text.class);
  67. FileInputFormat.setInputPaths(job, new Path("/home/hadoop/DataSet/Hadoop/WordCount-Result"));
  68. FileOutputFormat.setOutputPath(job, new Path("/home/hadoop/DataSet/Hadoop/TopK-output1"));
  69. System.out.println(job.waitForCompletion(true));
  70. } catch (IOException e) {
  71. // TODO Auto-generated catch block
  72. e.printStackTrace();
  73. } catch (ClassNotFoundException e) {
  74. // TODO Auto-generated catch block
  75. e.printStackTrace();
  76. } catch (InterruptedException e) {
  77. // TODO Auto-generated catch block
  78. e.printStackTrace();
  79. }
  80. }
  81. }

TopK的一个简单实现的更多相关文章

  1. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  2. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  3. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  4. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  5. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  6. CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能

    CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...

  7. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  8. 应用OpenMP的一个简单的设计模式

    小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...

  9. 用php实现一个简单的链式操作

    最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...

随机推荐

  1. Openresty增加waf配置

    Openresty增加waf配置 1. Ngx lua waf 说明 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击 防止svn/备份之类文件泄漏 防止Apach ...

  2. Java和C++通过Socket通信中文乱码的解决

    理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家…… 更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的 ...

  3. 修改oracle数据库的编码为utf-8

    1.查看数据库字符集 ? 数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集. 客户端字符集环境select * ...

  4. unity 主循环

    在unity官方文档中看到这个图,感觉很有用,各事件的先后时机看得较清楚. 连接:http://docs.unity3d.com/Manual/ExecutionOrder.html

  5. unity5, custom PBS shader

    unity5中引入了基于物理着色(PBS)的Standard shader.由于这种着色器通过调节参数和贴图可逼真模拟各种硬质表面,所以不必再像unity4时代那样需要对各种质感材质单独编写着色器,而 ...

  6. python中if __name__ == '__main__'的说明

    这个表示执行的是此代码所在的文件. 如果这个文件是作为模块被其他文件调用,不会执行这里面的代码. 只有执行这个文件时, if 里面的语句才会被执行. 这个功能经常可以用于进行测试. python中,当 ...

  7. 跟我一起学习VIM - vim插件合集

    2016-06-14 15:04 13333人阅读 评论(0) 收藏 举报 分类: Linux(104)  目录(?)[+]  前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教 ...

  8. SolrCloud:依据Solr Wiki的译文

    本文是作者依据Apache Solr Document的译文.翻译不对或者理解不到位的地方欢迎大家指正!谢谢! Nodes, Cores, Cluster and Leaders Nodes and ...

  9. [svc][op]ssh交互yes问题解决-expect

    Expect是Unix系统中用来进行自动化控制和测试的软件工具C67默认未安装:使用需要安装: yum install expect -ywhich expect #查看安装路径 核心命令: [roo ...

  10. 【Android】19.0 第19章 前面章节的代码优化及本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-05 一.简介 这一章我们介绍"共享存储和内容提供程序"的基本用法. 二.先优化一下前面章节例子的代码 在前面 ...