我有多个输入源,并且使用了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指定为输出类型。它必须是具体类型。所有记录都必须具有相同的(具体)键和值类型,即MapperReducer。如果需要其他类型,则可以创建某种混合的Writable,其中包含“A”或“B”。这有点丑陋,但是可以正常工作,例如在Mahout中就做了很多。

但是我不知道为什么这会使 reducer 不运行。根据此信息,这很可能是完全分开的,无法回答。

关于hadoop - 多种自定义可写格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10294944/

10-10 04:59