问题来源:
在执行reduce端join操作时,或者我们在多个Mapreduce计算中将不同属性类型的数据聚合成一个数据集合时需要避免复杂性时,从mapper中输出属于多个值类型的数据集合,是非常有用的。偶或者我们需要处理不同的文件书写多个mapper时,每个文件传入的数据类型不同,在进行数据聚合时。然而,Hadoop reduce不允许多个输入值类型。在这种情况下,可以使用Genericwritable类来包装属于不同数据类型的多个value实例。
数据举例:
172.16.31.44 100 www.baidu.com
222.139.215.195 120 www.google.com
222.139.215.195 330 www.360.com
172.16.31.44 400 www.uc.net
222.139.215.195 50 www.pigai.org
上面数据是以制表符分割的,第一个字段为IP,第二个字段表示请求字长,第三个表示请求链接。我们在map阶段以IP作为key值,请求字长和请求链接作为vlaue,目的是汇总相同IP的请求总字长,以及输出请求的所有链接。
输出结果:
172.16.31.44 500——www.uc.net www.baidu.com
222.139.215.195 500——www.pigai.org www.360.com www.google.com
操作步骤:
下列步骤显示了如何实现Hadoop GenericWritable数据类型,该数据类型可以封装数据类型为Intwritable或Text的实例。
- 写一个类扩展org.apache.hadoop.io.GenericWritable类。实现getType()方法,返回将要使用的Writable类的数组。如果要添加一个自定定义的构造函数,那么也要确保添加的是一个无参数的默认构造函数。
public class LogValueWritable extends GenericWritable {
//定义要返回的Writable数组
private static Class[] CLASS = new Class[]{
Text.class,
IntWritable.class
};
//无参数的默认构造函数
public LogValueWritable(){}
//定义Text类型的构造函数
public LogValueWritable(Text text){
super.set(text);
}