我有多个输入源,并且使用了Sqoop的codegen工具为每个输入源生成自定义类
public class SQOOP_REC1 extends SqoopRecord implements DBWritable, Writable
public class SQOOP_REC2 extends SqoopRecord implements DBWritable, Writable
在 map 方面,根据输入源,我相应地创建了上述2类的对象。
我将键的类型设置为“文本”,并且由于我有2种不同类型的值,因此我将值输出类型保留为“可写”。
在归约方面,我将值类型接受为可写。
public class SkeletonReduce extends Reducer<Text,Writable, Text, Text> {
public void reduce(Text key, Iterable<Writable> values, Context context) throws IOException,InterruptedException {
}
}
我也设定
job.setMapOutputValueClass(Writable.class);
在执行期间,它根本不会进入reduce函数。
有人可以告诉我是否可以这样做?如果是这样,我在做什么错?
最佳答案
您不能将Writable
指定为输出类型。它必须是具体类型。所有记录都必须具有相同的(具体)键和值类型,即Mapper
和Reducer
。如果需要其他类型,则可以创建某种混合的Writable
,其中包含“A”或“B”。这有点丑陋,但是可以正常工作,例如在Mahout中就做了很多。
但是我不知道为什么这会使 reducer 不运行。根据此信息,这很可能是完全分开的,无法回答。
关于hadoop - 多种自定义可写格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10294944/