java - mapreduce程序抛出数组索引超出范围错误

标签 java apache hadoop mapreduce bigdata

我对MapReduce模型非常陌生。我正在尝试读取多个文件,这些文件首先由冒号(唯一ID)分开,然后由逗号分隔(例如,cust ID,int值)。我想解析所有文件,并汇总与输出文件中的唯一ID对应的所有客户ID和整数值。我得到一些数组索引超出范围,而且我也不知道如何用我的代码解析所有文件。我应该使用tokenizer来遍历值或Map函数吗?我的代码如下:

public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
int rating = 0;
Text CustID;
IntWritable r;
Text MovieID;
public void map(LongWritable key, Text line, Context context) throws IOException, InterruptedException {
        String line1 = line.toString();
        String [] fields = line1.split(":");
        String Movieid = fields[0];
        String line2 = fields[1];
        String [] splitline = line2.split(",");
        String Custid = splitline[0];
        int rate = Integer.parseInt(splitline[1]);
        r = new IntWritable(rate);
        CustID.set(Custid);
        MovieID.set(Movieid);
        context.write(MovieID,r);

修改后的代码根据BlackSmith的建议,感谢铁匠铺为您提供的所有帮助。但是我仍然得到空的输出文件。请提示。
public void map(LongWritable key, Text line, Context context
                ) throws IOException, InterruptedException {
        String line1 = line.toString();
        String [] fields = line1.split(":");
        if(fields.length > 1)
             {
             String Movieid = fields[0];
             String line2 = fields[1];
             String [] splitline = line2.split(",");
             String Custid = splitline[0];
             int rate = Integer.parseInt(splitline[1]);
             r = new IntWritable(rate);
             CustID = new Text(Custid);
             MovieID = new Text(Movieid);
             context.write(MovieID,r);
             }
             else
             {
             return;
             }
             }
          }
        public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
        public void reduce(Text key, Iterable<IntWritable> values, Context context
                   ) throws IOException, InterruptedException {
  for (IntWritable val : values) {
    context.write(key, val);
    }}}

我可以在控制台上写任何东西以查看为什么生成输出文件,但输出为空的原因。

最佳答案

发生这种情况是由于存在不良记录。您的map期望输入如下内容:

Matrix:Reeves,5

但是输入文件的某处包含一条记录,但没有这两个字符:,。空行可能是罪魁祸首。您只需要对splits数组进行长度检查即可。代替直接访问索引,将它们放在验证块中。例如:
String [] fields = line1.split(":");
if( fields.length>1 ){     
    String Movieid = fields[0];
    String line2 = fields[1];
} else {
    // initialize Movieid & line2 tosome default value
    // OR simply put a 'return' statement to skip bad inputs  
} 
splitline数组必须遵循相同的策略。我认为您不需要代码。再次不要使用StringTokenizer,由于遗留原因,它仍然存在。

关于java - mapreduce程序抛出数组索引超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707676/

相关文章:

hadoop - Hadoop输入拆分与 block

java - 基于语言环境的 GregorianCalendar 日期字符串

java - 用Java读取XML文件

apache - .htaccess 301 将所有 https 重定向到 http 除了一页

apache - 仅允许相对路径

php - 加载 index.php 作为我在 PHP 中的第一页

hadoop - 提取 pig 场的一部分

java - 创建一个控制台菜单供用户进行选择

java - 选择特定文本值后的行 SQL Server

apache-spark - 是否可以使用HADOOP YARN运行任何应用程序或程序?