Loops 映射减少错误输出/如何在减少器中进行减法。java.lang.ArrayIndexOutOfBoundsException:1

Loops 映射减少错误输出/如何在减少器中进行减法。java.lang.ArrayIndexOutOfBoundsException:1,loops,mapreduce,iterator,output,reducers,Loops,Mapreduce,Iterator,Output,Reducers,我试图从给定的键(从映射器)中找到两个值之间的范围/差异 我想做TMAX减去TMIN(TMAX-TMIN),但是我得到的结果是负的,我不知道如何解决这个问题 如何找出键形成的两个值之间的范围/差异 样本数据集 站点日期(YYYYMMDD)元件温度标志1标志2其他值 我只需要数据集中的站点、日期(键)、元素和温度(值) USW00003889,20180101,TMAX,122,7,1700 USW00003889,20180101,TMIN,-67,7,1700 UK000056225,2018

我试图从给定的键(从映射器)中找到两个值之间的范围/差异

我想做TMAX减去TMIN(TMAX-TMIN),但是我得到的结果是负的,我不知道如何解决这个问题

如何找出键形成的两个值之间的范围/差异

样本数据集

站点日期(YYYYMMDD)元件温度标志1标志2其他值

我只需要数据集中的站点、日期(键)、元素和温度(值)

USW00003889,20180101,TMAX,122,7,1700
USW00003889,20180101,TMIN,-67,7,1700
UK000056225,20180101,TOBS,56,7,1700
UK000056225,20180101,PRCP,0,7,1700
UK000056225,20180101,SNOW,0,7
USC00264341,20180101,SNWD,0,7,1700
USC00256837,20180101,PRCP,0,7,800
UK000056225,20180101,SNOW,0,7
UK000056225,20180101,SNWD,0,7,800
USW00003889,20180102,TMAX,12,E
USW00003889,20180102,TMIN,3,E
UK000056225,20180101,PRCP,42,E
SWE00138880,20180101,PRCP,50,E
UK000056225,20180101,PRCP,0,a
USC00256480,20180101,PRCP,0,7,700
USC00256480,20180101,SNOW,0,7
USC00256480,20180101,SNWD,0,7,700
SWE00138880,20180103,TMAX,-228,7,800
SWE00138880,20180103,TMIN,-328,7,800
USC00247342,20180101,PRCP,0,7,800
UK000056225,20180101,SNOW,0,7
SWE00137764,20180101,PRCP,63,E
UK000056225,20180101,SNWD,0,E
USW00003889,20180104,TMAX,-43,W
USW00003889,20180104,TMIN,-177,W

你从来没有费心去计算最小值或最大值,那么你认为你在减去什么呢?正如我已经指出的,你不能接受一个集合的差异。这没有道理。然而,你仍然在努力做到这一点。。。最小值和最大值不是数据的两个元素。它们是需要从整个集合计算的统计数据。我不太确定你的意思,但我尝试了另一种方法,但我遇到了IndexOutOfBounds问题,请检查。这是因为你创建了一个新数组,然后愚蠢地假设它有2个元素。显然,它没有。好吧,我试着思考一下,我在循环中创建这些方法来获得要计算的值吗?你不能在循环中创建方法。您可以在类中创建它们。为一个程序创建一个具有新主方法的新类,该程序的唯一目的是证明您正确创建了这些方法。您从未费心计算最小值或最大值,那么您认为您在减去什么呢?正如我已经指出的,你不能接受一个集合的差异。这没有道理。然而,你仍然在努力做到这一点。。。最小值和最大值不是数据的两个元素。它们是需要从整个集合计算的统计数据。我不太确定你的意思,但我尝试了另一种方法,但我遇到了IndexOutOfBounds问题,请检查。这是因为你创建了一个新数组,然后愚蠢地假设它有2个元素。显然,它没有。好吧,我试着思考一下,我在循环中创建这些方法来获得要计算的值吗?你不能在循环中创建方法。您可以在类中创建它们。为一个程序创建一个具有新main方法的新类,该程序的唯一目的是证明您正确创建了这些方法。
Mapper Output Example
20180102,TMAX, 12
20180102,TMIN, 3
What I Want to do
20180102, 12 - 3
Reducer Current Output
20180102, -9
Reducer Desired Output
20180102, 9
            public static class MaxMinReducer
            extends Reducer<Text, IntWritable, Text, IntWritable> {

             public IntWritable result = new IntWritable();
              public void reduce(Text key, Iterable<IntWritable> values, Context context) throws 
                    IOException, InterruptedException {

                int value1 = 0;
                int value2 = 0;
                int differenceResult = 0;
                Iterator<IntWritable> iterator = values.iterator();


                while (values.iterator().hasNext()) {


                    if(value1 != 0){

                        value2 = iterator.next().get();
                        break;

                    } else {

                        value1 = iterator.next().get();
                    }

                    differenceResult = value1 - value2;     

                }

                differenceResult = value1 - value2;
                result.set(differenceResult);
                context.write(key, result);

              }

        }
        public static class MaxMinReducer
            extends Reducer<Text, Text, Text, Text> {

              public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

                String result = "";  
                int value1 = 0;
                int value2 = 0;
                int differenceResult = 0;
                String finalVal = "";   

                     for (Text val : values) {

                         finalVal = finalVal.concat(val.toString()).concat(",");

                     } 


                     finalVal = finalVal.substring(0,finalVal.length()-1);
                     String[] diffValues = finalVal.split(",");
                     value1 = Integer.parseInt(diffValues[1]);
                     value2 = Integer.parseInt(diffValues[0]);
                     differenceResult = value1 - value2;             
                     result = Integer.toString(differenceResult);

                     context.write(key, new Text(result));

              }

        }