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

在Hadoop作业中保存和读取复杂的可写值,hadoop,mapreduce,writable,Hadoop,Mapreduce,Writable,我需要将复杂值(实现可写)从第一个map reduce作业的输出移动到另一个map reduce作业的输入。保存到文件的第一个作业的结果。文件可以存储文本数据或字节可写(默认输出\输入格式)。所以我需要一些简单的方法来将我的可写转换为文本或字节可写并从中转换出来。它存在吗?有没有其他办法? 非常感谢用户irW正确,请使用SequenceFileOutputFormat。SequenceFile解决了这个问题,无需转换为文本可写。设置作业时,请使用job.setOutputKeyClass和job

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

用户irW正确,请使用SequenceFileOutputFormat。SequenceFile解决了这个问题,无需转换为文本可写。设置作业时,请使用job.setOutputKeyClass和job.setOutputValueClass设置正在使用的可写子类:

job.setOutputKeyClass(MyWritable1.class);
job.setOutputValueClass(MyWritable2.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
这将使用Hadoop SequenceFile格式来存储可写内容。然后在下一个作业中,使用SequenceFileInputFormat:

job.setInputFormatClass(SequenceFileInputFormat.class);
然后,此作业中映射器的输入键和值将是您最初在上一个作业中指定为输出的两个可写类


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

我自己没有尝试过,但您可能可以将输出写入sequencefile,这样您就不需要任何转换。其他人可能会对此进行详细说明。这可能会让你开始。因为我是一个保持简单的球迷,我会在评论中添加这个旁注。如果您在任何时候都希望使用JavaAPI以外的任何东西来读取文件,那么您将希望使用Avro,这是一种独立于语言的序列化格式。它将允许您使用诸如Pig或任何与MapReduce streaming兼容的程序等有用工具轻松处理数据。我经历了使用SequenceFile的痛苦,并对此感到遗憾,请参见以下问题: