我是HDFS和MapReduce的新手,正在尝试计算调查统计信息.输入文件的格式为:年龄点性别类别-所有这4个数字都是数字.这是正确的开始吗?
public static class MapClass extends MapReduceBase
implements Mapper<IntWritable, IntWritable, IntWritable, IntWritable> {
private final static IntWritable Age = new IntWritable(1) ;
private IntWritable AgeCount = new IntWritable() ;
public void map( Text key, Text value,
OutputCollector<IntWritable, IntWritable> output,
Reporter reporter) throws IOException {
AgeCount. set(Integer. parseInt(value. toString() ) ) ;
output. collect(AgeCount, Age) ;
}
}
我的问题:
1.这是正确的开始吗?
2.如果我想收集其他属性(例如Sex,Points),是否只需添加另一个output.collect语句?我知道我必须阅读这一行并将其拆分为属性.
3.在上面说实现了Mapper的地方-我使所有4个IntWritable都正确吗?
解决方法:
Mapper界面需要以下顺序的4种类型的参数:Map输入键,Map输入值,Map输出键和Map输出值.在您的情况下,由于您要处理4个整数,其中3个构成您的值而1个构成键,因此将IntWritable用作Map输入键是错误的,而应使用Text.另外,您在MapClass定义中指定的类型与传递给Map函数的类型不匹配.鉴于您正在处理文本文件,因此您的MapClass应该定义如下:
public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, IntWritable, IntWritable>
本质上,您假设每个map调用都输入一行文本文件,它将被解析为所需的字段,并将其转换为map函数中的int.因此,您的map函数将具有以下定义:
public void map(LongWritable key, Text value, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException {...}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。