首页 > 解决方案 > 如何从 .csv 列中获取最小值和最大值

问题描述

我尝试从 .csv 文件中获取最小值和最大值,但我的代码向我抛出了这个错误:

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:PSAnalyserGui.Test.main(Test.java:53) 处的索引 1 超出长度 0 的范围

代码:

public class Test {

 public static class ColMapper extends
   Mapper<Object, Text, Text, DoubleWritable> {
  public void map(Object key, Text value, Context context)
    throws IOException, InterruptedException {
   String[] cols = value.toString().split(",");
   for (int i = 0; i < cols.length; i++) { 
    context.write(new Text(String.valueOf(i + 1)),new 
DoubleWritable(Double.parseDouble(cols[i])));
   }
  }
 }
 public static class ColReducer extends
   Reducer<Text, DoubleWritable, Text, DoubleWritable> {
  public void reduce(Text key, Iterable<DoubleWritable> values,
    Context context) throws IOException, InterruptedException {
   double min = Integer.MAX_VALUE, max = 0;
   Iterator<DoubleWritable> iterator = values.iterator(); //Iterating 
   while (iterator.hasNext()) {
    double value = iterator.next().get();
    if (value < min) { 
     min = value;
    }
    if (value > max) {
     max = value;
    }
   }
   context.write(new Text(key), new DoubleWritable(min));
   context.write(new Text(key), new DoubleWritable(max));
  }
 }
 public static void main(String[] args) throws Exception {

  Configuration conf = new Configuration();
  Job job = new Job(conf, "\\ok.csv");
  job.setJarByClass(Test.class);
  FileSystem fs = FileSystem.get(conf);
  if (fs.exists(new Path(args[1]))) {
   fs.delete(new Path(args[1]), true);
  }
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(DoubleWritable.class);

  job.setMapperClass(ColMapper.class);
  job.setReducerClass(ColReducer.class);

  job.setInputFormatClass(TextInputFormat.class);
  job.setOutputFormatClass(TextOutputFormat.class);

  FileInputFormat.addInputPath(job, new Path(args[0]));
  FileOutputFormat.setOutputPath(job, new Path(args[1]));
  System.exit(job.waitForCompletion(true) ? 0 : 1);
 }
}

标签: java

解决方案


ArrayIndexOutOfBoundsException告诉您您正在尝试访问数组中大于数组维度的元素。

例如,给定

int[] arr = {1, 2, 3};

for (int i = 0; i < arr.length; i++) {
    System.out.println("index: " + i + "; value: " + arr[i]);
}

将输出

index: 0; value: 1
index: 1; value: 2
index: 2; value: 3

如果您尝试访问arr[3]一个ArrayIndexOutOfBoundsException将被抛出。

查看您的代码中是否出现这些情况(args在调用main方法时使用这些情况?)


推荐阅读