Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hadoop NaturalKeyGroupingComparator-What';减速器中发生了什么?_Java_Hadoop_Mapreduce - Fatal编程技术网

Java hadoop NaturalKeyGroupingComparator-What';减速器中发生了什么?

Java hadoop NaturalKeyGroupingComparator-What';减速器中发生了什么?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我目前正在从事一个JavaEMR项目,其中我的密钥由两个文本组成。 在我的一个步骤中,我将NaturalKeyGroupingComparator设置为仅比较键的左侧部分 下面是减速器的Java代码: public void reduce(对键、Iterable值、上下文)抛出IOException、InterruptedException{ int-totaloccurrents=0; 用于(数据值:值){ if(key.getRight().toString().equals(“*”){ T

我目前正在从事一个JavaEMR项目,其中我的密钥由两个文本组成。 在我的一个步骤中,我将NaturalKeyGroupingComparator设置为仅比较键的左侧部分

下面是减速器的Java代码:

public void reduce(对键、Iterable值、上下文)抛出IOException、InterruptedException{
int-totaloccurrents=0;
用于(数据值:值){
if(key.getRight().toString().equals(“*”){
TotalOccessments+=value.getOccessments();
}
否则{
setCount(新的IntWritable(totaloccurrencess));
}
}
}
现在一切都按计划进行得很好,但我不明白到底发生了什么。 在减速器的输入中的每个键组中,如何执行还原运行中间的键更改?

< P>还原()方法。 在您的情况下,当多个文本被用作键的一部分时,键被分组使用这两个文本作为键,因此您的输出将是

键组1,count1

键组2,count2

现在,当仅基于键的左侧部分更改分组时,减速器的分组也会更改,从而提供

 NewKeyGroup1, count1
 NewKeyGroup2, count2

为了更深入地理解,请阅读《权威指南》第8章关于二级排序的部分。

您的问题是一个很好的初学者问题:)

我已经写过了

我想需要记住的最大一点是Iterable不是由集合支持的,它是在调用next()方法时动态计算的。记住这一点

一旦你完成上面的帖子,如果你是我想看到代码类型的人

//第157行

 if (hasMore) {
      nextKey = input.getKey();
      nextKeyIsSame = comparator.compare(currentRawKey.getBytes(), 0, 
                                     currentRawKey.getLength(),
                                     nextKey.getData(),
                                     nextKey.getPosition(),
                                     nextKey.getLength() - nextKey.getPosition()
                                         ) == 0;
    } else {
      nextKeyIsSame = false;
    }
这是来自

每次调用next()时都会调用该方法,它基本上会检查基础流中的键是否在更改,如果不是,它只会传递下一个值(记住键是有序的),否则它会安排使用新键和iterable再次调用reducer方法

底层流始终是一个键、值对,ReducerContextImpl使您产生一种错觉/抽象,认为它是一个键、集合对

就像我一开始说的

要记住的最大一点是Iterable不是由集合支持的,它是在调用next()方法时动态计算的。记住这一点

这个主题在MapReduce框架中很常见,所有的计算都是在流上完成的,没有任何东西完全加载到内存中,我花了一段时间才得到这个主题:)因此我渴望分享它