我有一个包含键值对的csv文件;同一密钥可以有多条记录。我正在编写一个mapreduce程序来聚合这些数据-对于每个键,它应该给出键的频率和键的值之和。
我的Map器读取csv文件,并以文本类型发出key和value,即使它们是数字(这样做是因为我在使用floatwritable for value时遇到了问题)。
在reducer中,当我尝试将文本值转换为float时,我遇到了numberformatexception,错误中显示的值甚至不在我的输入中。
这是我的密码:
public static class AggReducer
extends Reducer<Text,Text,Text,Text> {
private Text result = new Text();
public void reduce(Text key, Iterable<FloatWritable> values,
Context context
) throws IOException, InterruptedException {
int numTrips = 0;
int totalFare = 0;
for (Text val : values) {
totalFare += Float.parseFloat(val.toString());
numTrips++;
}
String resultStr = String.format("%1s,%2s", numTrips, totalFare);
result.set(resultStr);
context.write(key, result);
}
}
注意:我让reducer生成mapper的输出而不做任何更改,这样就得到了预期的输出
1条答案
按热度按时间qpgpyjmq1#
运行numberformatexception时,错误中显示的值甚至不在我的输入中
嗯,那是不可能的。值需要在输入或生成的Map器输出中的某个位置。不过,try-catch在减速机中的效果和其他地方一样好
fwiw,使用doublewritable