当前位置: 首页 > 知识库问答 >
问题:

Hadoop(java)更改映射器输出值的类型

易炳
2023-03-14

我正在编写一个映射函数,它将键生成为一些user_id,值也是文本类型。我是这样做的

public static class UserMapper extends Mapper<Object, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text userid = new Text();
    private Text catid = new Text();

    /* map method */
    public void map(Object key, Text value, Context context)
                throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString(), ","); /* separated by "," */
        int count = 0;

        userid.set(itr.nextToken());

        while (itr.hasMoreTokens()) {
            if (++count == 3) {
                catid.set(itr.nextToken());
                context.write(userid, catid);
            }else {
                itr.nextToken();
            }
        }
    }
}

然后,在主程序中,我将映射器的输出类设置为:

    Job job = new Job(conf, "Customer Analyzer");
    job.setJarByClass(popularCategories.class);
    job.setMapperClass(UserMapper.class);
    job.setCombinerClass(UserReducer.class);
    job.setReducerClass(UserReducer.class);

    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class);

因此,即使我将输出值的类设置为text.class,但在编译时仍然会出现以下错误:

popularCategories.java:39: write(org.apache.hadoop.io.Text,org.apache.hadoop.io.IntWritable)
 in org.apache.hadoop.mapreduce.TaskInputOutputContext<java.lang.Object,
 org.apache.hadoop.io.Text,org.apache.hadoop.io.Text,
 org.apache.hadoop.io.IntWritable> 
 cannot be applied to (org.apache.hadoop.io.Text,org.apache.hadoop.io.Text)
 context.write(userid, catid);
                           ^
 public static class UserMapper extends Mapper<Object, Text, Text, Text> {

 }

共有1个答案

罗学真
2023-03-14

来自Apache文档页面

Class Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>

java.lang.Object
org.apache.hadoop.mapreduce.Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>

哪里

KEYIN = offset of the record  ( input for Mapper )
VALUEIN = value of the line in the record ( input for Mapper )
KEYOUT = Mapper output key ( Output of Mapper, input of Reducer)
VALUEOUT = Mapper output value ( Output of Mapper, input to Reducer)

在更正定义中的映射器值后,问题已经解决

public static class UserMapper extends Mapper<Object, Text, Text, IntWritable> {
public static class UserMapper extends Mapper<Object, Text, Text, Text> {
 类似资料:
  • 我遇到了一个非常非常奇怪的问题。还原器确实工作,但如果我检查输出文件,我只能找到映射器的输出。当我尝试调试时,在将映射器的输出值类型从Longwritable更改为Text之后,我发现了与单词计数示例相同的问题 这是结果。 然后我在输出文件中发现了奇怪的结果。这个问题发生在我将map的输出值类型和reducer的输入键类型更改为Text之后,无论我是否更改了reduce输出值的类型。我还被迫更改j

  • 我使用的是hadoop版本0.20和hadoop-core:1.2.0.jar 有没有可能使用新的hadoop API做到这一点?

  • 我只想用hadoop mapreduce来排序我的日志行。我将该行的所有字段作为输出键,并将输出值设置为null。但是当运行时,在第行出现空指针异常 所以为什么hadoop映射的输出值不能为空?为什么hadoop reduce的输出值可以(我测试过)?

  • 问题内容: hadoop的新手,并试图从此处了解mapreduce wordcount示例代码。 文档中的映射器是- 我看到在mapreduce字数示例中,映射代码如下 问题- Object类型的此键的作用是什么?如果映射器的输入是文本文档,那么我假设其中的值将是hadoop已分区并存储在HDFS中的文本块(64MB或128MB)。 更一般而言,此输入键Keyin在地图代码中的用途是什么? 任何指

  • 我正在使用MapStruct和maven,如文档中所述(http://mapstruct.org/documentation/stable/reference/html/). 现在,我想将生成的映射器类的位置从目标文件夹更改为源文件夹。我已经阅读了如何更改mapstruct生成的类location和M2E,以及如何将maven生成的源文件夹作为eclipse源文件夹,并通过使用maven处理器插件

  • 我得到这个错误: 14/12/10 18:11:01 INFO Mapred.JobClient:任务Id:Attest_201412100143_0008_M_000000_0,状态:失败java.io.ioException:溢出在org.apache.hadoop.mapred.maptask$MapOutputBuffer.Collect(maptask.java:425)在wordcou