我想写一个mapreduce作业,我需要迭代两次值。获取Reducer输入文件
因此,当给出数字csv
文件时,我们需要为每列应用此文件。
为此,我们需要找到min
和max
值并将其应用于equation
(v1)。
我做了什么至今
In map()
I emit the column id as key and each column as values
In Reduce()
I calculated the min and max values of each column.
之后,我卡住了。 下一步我的目标是apply
方程式
(v = [(v − minA)/(maxA − minA)]*(new maxA − new minA) + new minA)
我new maxA and new minA is 0.1,0.0
分别和我也有各列最大值和最小值。 为了应用eqn v1我需要v,即输入文件。
如何获得?
我想是 -
从输入csv文件采取的第一行(虹膜数据集)
[5.3,3.6,1.6,0.3]
申请等式为每个属性和发射整行(Min和Max值在已知的减速机本身)。但在reducer中,我只会得到列值。否则,我应该读取我的输入文件作为reducer()的setup()中的参数。
这是最佳实践。 任何建议。
UPDATE
由于Mark Vickery
建议我做了以下。
public void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException,
InterruptedException {
System.out.println("in reducer");
double min = Integer.MAX_VALUE,max = 0;
Iterator<DoubleWritable> iterator = values.iterator();
ListIterator<DoubleWritable> lit = IteratorUtils.toListIterator(iterator);
System.out.println("Using ListIterator 1st pass");
while(lit.hasNext()){
System.out.println(lit.next());
DoubleWritable value = lit.next();
if (value.get()< min) {
min = value.get();
}
if (value.get() > max) {
max = value.get();
}
}
System.out.println(min);
System.out.println(max);
// move the list iterator back to start
while(lit.hasPrevious()){
lit.previous();
}
System.out.println("Using ListIterator 2nd pass");
double x = 0;
while(lit.hasNext()){
System.out.println(lit.next());
}
在1日通过我能够让所有的值correctly.But 2次经过我只反复得到每个元素。
抱歉,我不得不去睡觉。我今天早上再次测试了'ListIterator',它工作正常。您能否将小代码转换为独立的运行代码并在ideone.com Java编辑器上重现问题? – anubhava
但它不适用于我anubhava :(。我试着更多。我得到相同的输出。任何其他的替代方法? –
@anubhava:即使我只是迭代您在http://发布的代码stackoverflow.com/questions/6111248/iterate-twice-on-values也输出相同的重复值。它似乎lit.previous()只适用于on.time.ie如果有10个元素,如果lit.previous完成,指针只能到第9个元素而不是第1个元素 –