关于reduce中遍历2次数据的问题

@(HADOOP)[hadoop]

reduce方法的javadoc中已经说明了可能会出现的问题:

The framework calls this method for each (key, (list of values)) pair in the grouped inputs. Output values must be of the same type as input values. Input keys must not be altered. The framework will reuse the key and value objects that are passed into the reduce, therefore the application should clone the objects they want to keep a copy of.

也就是说虽然reduce方法会反复执行多次,但key和value相关的对象只有两个,reduce会反复重用这两个对象。所以如果要保存key或者value的结果,只能将其中的值取出另存或者重新clone一个对象(例如Text store = new Text(value) 或者 String a = value.toString()),而不能直接赋引用。因为引用从始至终都是指向同一个对象,你如果直接保存它们,那最后它们都指向最后一个输入记录。会影响最终计算结果而出错。

解决办法:先用一个HashSet将values的各个值保存下来,然后再遍历这个HashSet。

@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {Set<String> outputValues = new HashSet<>();int sum = 0;//计算某个UDID在某个时间段出现LBS信息的总次数。for(Text value : values){outputValues.add(value.toString());String[] valueContent  = value.toString().trim().split(TAB_SEPERATOR);int count  = Integer.parseInt(valueContent[2]);sum += count;}//debug log//注意:reduce中key/value对象重用的问题:https://my.oschina.net/leejun2005/blog/131744if(sum >= LBS_FREQUENCE_THREADHOLD_TO_RETAIN){for(String value : outputValues){context.write(key, new Text(value));}}}

详细可参考:https://my.oschina.net/leejun2005/blog/131744

关于reduce中遍历2次数据的问题相关推荐

  1. Unity中遍历大量的数据

    Unity中遍历大量的数据 如果需要在脚本中使用同样的操作去一一判别大量的数据,C#倒是提供了一种不错的机制,读者或许会有兴趣,就是"循环".C#里有3种用于实现循环的语句,分别是 ...

  2. vue获取tr内td里面所有内容_React中遍历多个数据tr,td

    1,根据后台返回的数据来遍历table中的tr,td 分析:后台返回的数据类型: [ {time: "05-28", value: "3"}, {time: & ...

  3. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取文件中的文本行 | 查询文本行数据 | 追加文件数据 | 使用占位符方式拼接字符串 )

    文章目录 一.逐行遍历文件文本数据 1.获取文件中的文本行 2.查询文本行数据 3.追加文件数据 4.使用占位符方式拼接字符串 二.完整代码示例 一.逐行遍历文件文本数据 1.获取文件中的文本行 调用 ...

  4. C#在dataGridView中遍历,寻找相同的数据并定位

    1. C#在dataGridView中遍历,寻找相同的数据并定位 [c-sharp] view plain copy int row = dataGridView1.Rows.Count;//得到总行 ...

  5. C/C++中遍历cJSON数据

    C/C++中遍历cJSON数据 #include <stdio.h> #include "iostream" #include <string.h> #in ...

  6. 【.NET】C#中遍历各类数据集合的方法

    C#中遍历各类数据集合的方法,这里自己做下总结: 1.枚举类型              // 遍历枚举类型Sample的各个枚举名称              foreach  ( string   ...

  7. java script 遍历数组_JavaScript中数组中遍历的方法

    前言 最近看了好几篇总结数组中遍历方法的文章,然而"纸上得来终觉浅",决定此事自己干.于是小小总结,算是自己练手了. 各种数组遍历方法 数组中常用的遍历方法有四种,分别是: for ...

  8. js中操作树结构的数据

    现在前端操作树的数据结构还是挺常见的,我在这里总结一下js树形结构常见的操作方式.我也把它做成了工具类库,github地址. 一.遍历树结构的方式 假设现在有如下的数据结构,我们需要去找到树结构的中某 ...

  9. 如何在Tensorflow.js中处理MNIST图像数据

    by Kevin Scott 凯文·斯科特(Kevin Scott) 如何在Tensorflow.js中处理MNIST图像数据 (How to deal with MNIST image data i ...

最新文章

  1. 手机通讯录分组名称_基于Aandroid的手机操作系统(7)
  2. android 进lanucher的广播,(转)Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色...
  3. c语言smile定义函数,【C初始之习题五】
  4. python刷题相关资料汇总(一)
  5. 图解匈牙利算法(含python代码)
  6. URL转码escape() encodeURI() encodeURIComponent()
  7. ERROR:进行解析时遇到错误,找不到资源“$(string.VerMgmtAuditModeEnable)”
  8. 三大框架ssh整合(一)
  9. 实现一个进度条的打印
  10. 服务器怎么跑python_在Linux服务器上跑Python Unet程序
  11. CriminalIntent项目开发
  12. 联想Y580黑苹果安装
  13. 基于OCR的身份证要素提取-2019
  14. c语言 go to 用法,c语言中 go to语句的使用方法
  15. 电脑桌面计算机被隐藏怎么恢复,电脑隐藏图标怎么恢复_电脑隐藏的怎么恢复...
  16. 惠州龙门大米飘香 国稻种芯-中国水稻节:广东乡村振兴样板
  17. Accelio 代码笔记
  18. 怎样提高报表呈现的性能
  19. k8s 部署 xxl-job-admin:2.3.0
  20. CDA数据分析师认证证书含金量不断提高,成数据分析入门新刚需!

热门文章

  1. 测试点错的来:1024 科学计数法 (20分)
  2. 5行代码AC——L1-029 是不是太胖了 (5分)
  3. java tostring方法_Java程序员小伙启动项目报错,原来是使用了lombok
  4. json python无效语法_在python中打开无效的json文件
  5. 2011-07-04 22:11 Jfreechart生成曲线图数据点显示数据值
  6. java 命令读取参数_如何读取/处理命令行参数?
  7. cesium模型不遮挡点线面_cesium点线面测试数据
  8. android.process.media+sd,android P系统WRITE_MEDIA_STORAGE添加读写SD卡权限
  9. 修改mysql字符集_mysql 修改字符集
  10. arm linux 添加ntp服务,嵌入式linux添加NTP服务