Java reducer中的重复数据消除工作不符合预期

Java reducer中的重复数据消除工作不符合预期,java,mapreduce,Java,Mapreduce,我有一个PersonDto对象,它覆盖了equals()和hashCode()方法 减速器中的主代码: Set<PersonDto> set = new HashSet()<>; while(iterator.hasNext()){ Record red= iterator.next(); PersonDto dto = new PersonDto(); dto.setName(red.getString("name")); dto.setAge(

我有一个
PersonDto
对象,它覆盖了
equals()
hashCode()
方法

减速器中的主代码:

Set<PersonDto> set = new HashSet()<>;
while(iterator.hasNext()){
   Record red= iterator.next();
   PersonDto dto = new PersonDto();
   dto.setName(red.getString("name"));
   dto.setAge(red.getBigInt("age"));
   set.add(dto);
}
for (PersonDto dto : set) {
   context.write(new Text(dto.getname()+","+dto.getAge()));
}
Set Set=newhashset();
while(iterator.hasNext()){
Record red=iterator.next();
PersonDto=新PersonDto();
dto.setName(red.getString(“name”);
dto.设置(红色,getBigInt(“年龄”));
set.add(dto);
}
用于(个人到dto:设置){
write(新文本(dto.getname()+”,“+dto.getAge());
}
但HDFS上的最后一个文件显示仍然存在相同的记录。
代码有什么问题?是否应该使用映射键进行重复数据消除?

是否有多个还原器?如果是,则有可能在多个减速器中使用同一个人对象。在这种情况下,由于每个reducer都是独立执行并写入HDFS的,因此最终输出中可能会出现重复的Person记录

是否应该在一个reducer上处理具有相同密钥的记录?这取决于您的密钥,您是否使用相同的哈希代码作为map reduce应用程序的密钥进行重复数据消除?是的,我认为是这样。密钥是用字符串生成的,因此具有相同密钥的记录应该在一个jvm reducer中处理,对吗?您正在处理的数据的大小是多少,如果它类似于概念验证或较小的东西,并且如果您可以选择使用一个减速器,那么您可以检查使用一个减速器是否解决了您的问题。如果它的行为符合您的期望,那么您必须查看如何在map reduce应用程序中键入您的个人记录。要获得更完整的答案,您必须提供一些额外的信息,如
equals()
hashCode()
实现、减缩器数量、map方法(或映射器中输出键值对的格式),以及一些输出和输入示例。预期的结果是什么,实际的输出是什么?在此之前,直观地说,如果您的equals()方法不是实际映射输出键上的函数,正如Amit所建议的。好的,我知道了。还原程序也可以工作,映射键是人名,记录映射到一个jvm还原程序。根本原因是某些人名应该被修剪。