在Hadoop作业中保存并读取复杂的可写值

时间:2013-10-15 08:03:30

标签: hadoop mapreduce writable

我需要将复杂的值(实现Writable)从第1个map-reduce作业的输出移动到其他map-reduce作业的输入。第一个作业的结果保存到文件。文件可以存储文本数据或BytesWritable(使用默认输出\输入格式)。所以我需要一些简单的方法将我的Writable转换为Text或To BytesWritable并从中转换。它存在吗?有没有其他办法呢? 非常感谢

1 个答案:

答案 0 :(得分:0)

用户irW是正确的,使用SequenceFileOutputFormat。 SequenceFile解决了这个确切的问题,而无需转换为Text Writable。设置作业时,使用job.setOutputKeyClass和job.setOutputValueClass设置您正在使用的Writable子类:

job.setOutputKeyClass(MyWritable1.class);
job.setOutputValueClass(MyWritable2.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);

这将使用Hadoop SequenceFile格式存储您的Writable。然后在下一个作业中,使用SequenceFileInputFormat:

job.setInputFormatClass(SequenceFileInputFormat.class);

然后,此作业中映射器的输入键和值将是您最初在上一个作业中指定为输出的两个可写类。

注意,正确实现复杂的Writable子类至关重要。除了必须有一个空构造函数之外,必须实现write和readFields方法,以便类中的任何Writable字段也可以写入和读取它们的信息。