Java 映射中的值类型不匹配
我正在使用oozie工作流运行此代码,并获得类型不匹配错误:Java 映射中的值类型不匹配,java,hadoop,Java,Hadoop,我正在使用oozie工作流运行此代码,并获得类型不匹配错误: public static class mapClass extends Mapper<Object, Text, LongWritable, LongWritable> { public void map(Object, Text, Context..) .. context.write(<LongWritable type> , <LongWritable type
public static class mapClass extends Mapper<Object, Text, LongWritable, LongWritable> {
public void map(Object, Text, Context..)
..
context.write(<LongWritable type> , <LongWritable type> )
}
public static class reduceClass extends Reducer<LongWritable, LongWritable,LongWritable, LongWritable> {
public void reduce(LongWritable, LongWritable, context)
..
context.write(<LongWritable type>, <LongWritable type>)
{
}
注意:我将对象类型更改为LongWritable,这没有任何区别。在workflow.xml中使用以下属性时引发上述异常。在没有以下属性的情况下,代码执行时产生的输出与以偏移量为前缀的输入相同
<property>
<name>mapred.output.key.class</name>
<value>org.apache.hadoop.io.LongWritable</value>
</property>
<property>
<name>mapred.output.value.class</name>
<value>org.apache.hadoop.io.LongWritable</value>
</property>
mapred.output.key.class
org.apache.hadoop.io.LongWritable
mapred.output.value.class
org.apache.hadoop.io.LongWritable
您很可能将reducer用作组合器,这意味着它在映射的上下文中运行。在这里可以看到一个类似的问题您很可能将reducer用作组合器,这意味着它在map的上下文中运行。在这里看到一个类似的问题好的,我明白了。问题出在我定义的oozie工作流中
I had
<name>mapreduce.mapper.class</name>
and
<name>mapreduce.reducer.class</name>
instead of
<name>mapreduce.map.class</name>
and
<name>mapreduce.reduce.class</name>
我有
mapreduce.mapper.class
及
mapreduce.reducer.class
而不是
mapreduce.map.class
及
mapreduce.reduce.class
[参考Api先生]由于某种原因,我看不见:-(因为我使用的是非Api工作流的修改版本
谢谢大家抽出时间。好的,我知道了。问题出在我定义的oozie工作流中
I had
<name>mapreduce.mapper.class</name>
and
<name>mapreduce.reducer.class</name>
instead of
<name>mapreduce.map.class</name>
and
<name>mapreduce.reduce.class</name>
我有
mapreduce.mapper.class
及
mapreduce.reducer.class
而不是
mapreduce.map.class
及
mapreduce.reduce.class
[参考Api先生]由于某种原因,我看不见:-(因为我使用的是非Api工作流的修改版本
谢谢大家的时间。发布的代码看起来不错。你能发布完整的代码吗?一般来说,不要忘记Java泛型在运行时是不强制的,因此任何人都可以按照自己的意愿在映射中放置任何对象。因此,如果将某个对象放置在Hadoop文本实例中而不是Hadoop LongWritable中,你会收到此消息。更多代码,完整堆栈异常竞争会有帮助。同意owlstead。如果映射器的第一个模板项不是
对象
,我会感觉更好。我已经添加了代码供您参考。发布的代码看起来不错。您可以发布完整的代码吗?一般来说,不要忘记Java泛型在运行时不会强制执行,所以任何人都可以将任何对象作为一个对象放在映射中他们希望如此。因此,如果将某些内容放在Hadoop文本实例中而不是Hadoop LongWritable中,您将收到此消息。更多代码,异常的完整堆栈跟踪将很有帮助。同意owlstead。如果映射器的第一个模板项不是对象
,我会感觉更好。我添加了代码供您参考。还原程序是LongWritable,LongWritable
->LongWritable,LongWritable
,映射器正在输出LongWritable,LongWritable
,所以它应该是好的……还原器是LongWritable,LongWritable
,映射器正在输出LongWritable,LongWritable
,所以它应该是好的...
I had
<name>mapreduce.mapper.class</name>
and
<name>mapreduce.reducer.class</name>
instead of
<name>mapreduce.map.class</name>
and
<name>mapreduce.reduce.class</name>