我正在尝试为以下数据运行mapreduce程序。
这是我的Map程序代码:
@Override
protected void map(Object key, Text value, Mapper.Context context) throws IOException, ArrayIndexOutOfBoundsException,InterruptedException {
String tokens[]=value.toString().split(",");
if(tokens[6]!=null){
context.write(new Text(tokens[6]), new IntWritable(1));
}
}
由于我的一些细胞数据是空的,当我试图读取列载波延迟我得到下面的错误。请告知。
17/04/13 20:45:29 INFO mapreduce.Job: Task Id : attempt_1491849620104_0017_m_000000_0, Status : FAILED
Error: java.lang.ArrayIndexOutOfBoundsException: 6
at Test.TestMapper.map(TestMapper.java:22)
at Test.TestMapper.map(TestMapper.java:17)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
Configuration conf = new Configuration();
Job job = Job.getInstance(conf,"IP Access");
job.setJarByClass(Test.class);
job.setMapperClass(TestMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setReducerClass(TestReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
3条答案
按热度按时间o2g1uqev1#
所有列都是图像中显示的列?如果是这样的话,请记住java数组是0索引的,列的范围是0到5,所以标记[6]超出了界限。或者,根据必要的逻辑,您也可以在您的中添加验证,如果:
if(tokens.length>n&&tokens[n]=null){context.write(new text(tokens[n]),new intwriteable(1));}
pb3skfrl2#
问题在于:
if(tokens[6]!=null){
.问题是您希望获取令牌[6]的值,然后检查它是否为null。但是,有些行只包含六列(第七列为空),所以
tokens
在这些情况下,是一个六元素数组。这意味着它包含来自tokens[0]
至tokens[5]
. 当你尝试访问tokens[6]
,则超出数组的大小,因此得到arrayindexoutofboundsexception。正确的方法是:
更多提示:从您的部分代码判断,我猜您希望计算特定载波延迟值出现的次数。在这种情况下,您还可以使用组合器来加快进程,就像wordcount程序那样。还可以将载波延迟解析为可写的整数,以节省时间和空间。
qlfbtfca3#
载波延迟是第二个字段,因此需要使用令牌[1]进行访问,因为数组索引从0开始。您还可以在访问特定索引之前进行长度检查。令牌[6]出现错误,因为您总共有6列。如果您正在访问最后一个字段,它将是标记[5],即长度减1。