Map 中的 Pair 类减少抛出错误

Posted

技术标签:

【中文标题】Map 中的 Pair 类减少抛出错误【英文标题】:Pair class in Map reduce throwing error 【发布时间】:2014-11-03 17:49:24 【问题描述】:

为什么 Pair 类在下面的代码中抛出错误

 import java.io.IOException;
 import java.util.*;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapreduce.Job;
 import org.apache.hadoop.mapreduce.Mapper;
 import org.apache.hadoop.mapreduce.Reducer;
 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 import org.apache.hadoop.util.GenericOptionsParser;
 import org.apache.commons.lang3.tuple.*;

 public static class PrizeMapper extends Mapper<LongWritable, Text, Text, Pair>

 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(":");
        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);
             // CustID.set(Custid);
             //MovieID.set(Movieid);
             context.write(MovieID,new Pair(CustID,r));
             
             else
             
             return;
             
  


public static class IntSumReducer extends Reducer<Text,Pair,Text,Pair> 
private IntWritable result = new IntWritable();
public void reduce(Text key, Pair values, Context context) throws IOException, InterruptedException 
    context.write(key, values);

错误: 找不到标志 [javac] 扩展映射器 [javac] ^ [javac] 符号:类对 [javac] 位置: 找不到标志 [javac] 扩展 Reducer [javac] ^ [javac] 符号:类对

【问题讨论】:

你有Pair 的导入吗?您没有在(严重缩进的)代码中显示 任何 导入。 什么是“对”?我不认为Hadoop中有这样一个类,扩展Writable。因此,它应该是您定义的一个类,并且它还应该扩展 Writable,因为它被用作一个值。 非常感谢您的回复。我已经添加了 import org.apache.commons.lang3.tuple.* 语句(在网上浏览)但是它抛出错误,你能建议我需要添加哪个 import 语句。 非常感谢 JonSkeet Skeet 和 @Vefthym,您的建议对我帮助很大。我想接受您的建议作为答案,但它没有作为答案出现。我想可能是因为它的评论很好,非常感谢您的回复。 @Manvi 我已经添加了答案 【参考方案1】:

好吧,Pair 似乎是您定义的一个类,因为它不是标准的 Hadoop Writable 类之一。

问题在于您没有导入它,正如 Jon Skeet 在他的评论中提到的那样。

但是,请记住,由于您将其用作 reduce 输出值,因此它也应该是实现 Writable 接口的类。

【讨论】:

以上是关于Map 中的 Pair 类减少抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 错误在模板类中声明 std::pair

ReactPHP libevent 和 socket_pair 抛出错误

map.insert:pair<enum,vector<*>> 出现“无效参数”错误

解析编译错误:没有匹配函数调用 'std::pair<,>::pair()'

C++ unordered_map emplace() 函数抛出段错误,我不知道为啥

推进 sql:insert 抛出错误“无法解析 sqldb.map 的内容”