数据:
1979 23 23 2 43 24 25 26 26 26 26 25 26 25
1980 26 27 28 28 28 30 31 31 31 30 30 30 29
1981 31 32 32 32 33 34 35 36 36 34 34 34 34
映射器:
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String lasttoken = null;
StringTokenizer s = new StringTokenizer(line,"\t");
String year = s.nextToken();
while(s.hasMoreTokens())
{
lasttoken=s.nextToken();
}
int val = Integer.parseInt(lasttoken);
context.write(new Text(year), new IntWritable(val));
}
}
减速机:
public static class Reduce extends MapReduceBase implements Reducer< Text, IntWritable, Text, IntWritable >
{
//Reduce function
public void reduce( Text key, Iterator <IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException
{
int val=0;
while (values.hasNext())
{
val=values.next().get();
{
output.collect(key, new IntWritable(val));
}
}
我收到了一个numberFormatException。
答案 0 :(得分:0)
异常可能就在这里:
trim()
在该语句之前打印该值并查看它是什么。它可能是空的,无效的,或者只是一个数字
一个好的尝试是在lasttoken上调用lasttoken
。这将删除前导和尾随空格。它可能有一些额外的空格或换行符。
无论哪种方式,你应该检查s
是否为空(如果distances = haversine_np(df.lat, df.lng, target_lat, target_lng)
为空可能会发生),修剪它并使用某种实用工具方法或通过捕获NumberFormatException检查它是否为数字。以有意义的方式处理,以防止程序崩溃。