我对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/