reduce 阶段遍历对象添加到ArrayList中的问题

起初遍历values时直接把对象添加到集合中,后来输出结果和预期不符,debug时发现添加到集合中的对象的值全部是最后一个对象的值,网上百度了下,发现是reduce阶段对象重用的问题,reduce阶段的key,value分别指向一个对象,无论操作了多少个键值对,始终是这两个对象,而ArrayList的add()添加的是对象的引用而不是对象的值,所以如果想要保存key,value的值(属性),需要重新new一个对象进行保存,需要添加到集合中的,应当先new一个对象,拷贝属性后再添加到集合中,不能把直接key,value添加到集合中(除非你的迭代器中只有一个值)

具体可以参考https://my.oschina.net/leejun2005/blog/131744

 1 protected void reduce(Text key, Iterable<TableBean> value,
 2             Reducer<Text, TableBean, TableBean, NullWritable>.Context context) throws IOException, InterruptedException {
 3
 4         List<TableBean>    orderBeanList = new ArrayList<TableBean>();
 5         TableBean pdBean  = new TableBean();
 6
 7         //分拣存储
 8         for (TableBean tableBean : value) {
 9             String name = tableBean.getpName();
10             if(StringUtils.isBlank(name)) {
11                 TableBean bean = new TableBean();
12                 try {
13                     BeanUtils.copyProperties(bean, tableBean);
14                 } catch (IllegalAccessException e) {
15                     e.printStackTrace();
16                 } catch (InvocationTargetException e) {
17                     e.printStackTrace();
18                 }
19                 //orderBean
20                 orderBeanList.add(bean);
21             }else {
22                 try {
23                     BeanUtils.copyProperties(pdBean, tableBean);
24                 } catch (IllegalAccessException e) {
25                     e.printStackTrace();
26                 } catch (InvocationTargetException e) {
27                     e.printStackTrace();
28                 }
29             }
30         }
31
32         //遍历集合进行合并
33         for (TableBean tableBean : orderBeanList) {
34             tableBean.setpName(pdBean.getpName());
35             //写出
36             context.write(tableBean,NullWritable.get());
37         }
38
39     }

原文地址:https://www.cnblogs.com/tele-share/p/9674633.html

时间: 2024-10-05 04:56:16

reduce 阶段遍历对象添加到ArrayList中的问题的相关文章

如何把数值或者对象添加到ArrayList集合

生成6个1~33之间的随机整数,添加到集合,并遍历 public class ArrayListDemo1 { public static void main(String[] args) { // 创建Random 对象 Random random = new Random(); // 创建ArrayList 对象 ArrayList<Integer> list = new ArrayList<>(); // 添加随机数到集合 for (int i = 0; i < 6;

关于将多个json对象添加到数组中的测试

如果用数组push添加不到数组中的,这个我也不知道是为什么?然后我选择了另一种发放就是从数组出发,逆向添加 最后的数组是这样的: data1=['公司1','公司2','公司3','公司4']; arrVal=[355,310,520,260]; data2=[ {value:335, name:'公司1'},{value:310, name:'公司2'}, {value:234, name:'公司3'}, {value:1548, name:'公司4'}]; 这样是不行的: for(var i

java集合练习:创建Map集合,创建Emp对象,并将创建的Emp对象添加到集合中

package com.jihe; public class Emp { private String e_id; private String e_name; public Emp(String e_id, String e_name) { super(); this.e_id = e_id; this.e_name = e_name; } public String getE_id() { return e_id; } public void setE_id(String e_id) { t

[ css 伪对象添加 content ] css中content内容生成技术以及应用问题讲解及实例演示

小小的提醒 在进入正题之前,我要做一回啰嗦的老女人,讲点可有可无无伤大雅的提醒: 仅在CSS可用的现代浏览器下起作用 不可通过DOM使用,它只是纯粹的表象 最基本的 – 生成内容 content使用如下: h2:before { content: "我是额外文字!"; } 此段样式的作用是在每个h2标签的前面添加文字“我是额外文字”.您可以狠狠地点击这里:content最基本使用Demo content属性的值除了使用文本值外,还可以使用标签的一些属性值,方法是attr(),参见如下代

1.22 P235第三题创建Map集合,创建Emp对象,将Emp对象添加到集合中,并将id为005的对象从集合中移除。

1 public static void main(String[] args) { 2 3 HashMap<String,String> map = new HashMap<String,String>(); //创建集合map 4 5 Emp e1 = new Emp("001","星期一"); 6 Emp e2 = new Emp("002","星期二"); 7 Emp e3 = new Emp(

JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和ArrayList.HashSet.LinkedList等等.根据核心框架图,相信我们都已经对Collection这个JavaSE中最常用API之一有一个较为全面的认识. 这个学习过程,还可以推及到其他常用开源框架和公司项目的学习和熟悉上面.借助开发工具或说明文档,先是对项目整体有一个宏观的认识,再根

Hadoop学习笔记—10.Reduce阶段中的Shuffle过程

一.回顾Reduce阶段三大步凑 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步凑,其中在Reduce阶段总共三个步凑,如下图所示: 其中,Step2.1就是一个Shuffle操作,它针对多个map任务的输出按照不同的分区(Partition)通过网络复制到不同的reduce任务节点上,这个过程就称作为Shuffle. PS:Hadoop的shuffle过程就是从map端输出到reduce端输入之间的过程,这一段应该是Hadoop中最核心的部分,因为涉及到Had

随机的将1-100之间的数据添加到 ArrayList数组中

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication2 { class Program { //随机的将1-100之间的数据添加到 ArrayList数组中 static void Main(string[] args) { ArrayList arrlist = new

jquery中each遍历对象和数组示例

通用遍历方法,可用于遍历对象和数组.$().each(),回调函数拥有两个参数: 第一个为对象的成员或数组的索引,第二个为对应变量或内容.如需退出each循环可使回调函数返回false 现有如下两个select 计划类别: <select id="PLANTYPE"> <option value="0">-所有-</option> <option value="1">新建</option>