我试图在内存排序中实现,即。根据没有。数量。我面临下面的问题,在Reduce类的close方法中的output.collect中的null pinter异常。请帮助!
我的编码逻辑是否正确?我在内存中保存了来自reduce方法的不同实例的标记。请帮我!我想要一个基于TCounts的排序输出。
package com.a;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
public class Map1 extends MapReduceBase implements Mapper<LongWritable, Text, Text,
Text >{
public void map(LongWritable key, Text value, OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
StringTokenizer tokenizer = new StringTokenizer(value.toString());
String tk = tokenizer.nextToken();
String id = tokenizer.nextToken();
String name = tokenizer.nextToken();
StringTokenizer tkz = new StringTokenizer(name, ",");
ArrayList<String> al = new ArrayList<String>();
while(tkz.hasMoreTokens())
{
name = tkz.nextToken();
al.add(name);
}
for(int i = 0; i<al.size(); i++)
{
output.collect(new Text(t+" "+al.get(i)), new Text("1"));
System.out.println("out key:----->"+t+" "+al.get(i));
}
}
}
public class Reduce1 extends MapReduceBase implements Reducer<Text, Text, Text, Text>{
// @SuppressWarnings("unchecked")
ArrayList<TCount> al = new ArrayList<TCount>();
String key_str = null;
private OutputCollector<Text, Text> output;
public void reduce (Text key, Iterator<Text> values, OutputCollector<Text,
Text> output, Reporter reporter) throws IOException {
int sum = 0;
while(values.hasNext())
{
String val = values.next().toString();
sum = sum+Integer.parseInt(val);;
}
String str_val = String.valueOf(sum);
key_str = key.toString();
//output.collect(key, new Text(str_val));
TCount tc = new TCount(key.toString(), sum);
al.add(tc);
}
private Text t = new Text();
private Text txt_key = new Text();
public void close() throws IOException {
Collections.sort(al);
for(int i = 0; i<al.size(); i++)
{
String tkn = al.get(i).getT();
System.out.println("token:-------------------> "+tkn);
System.out.println("output: "+output);
txt_key = new Text(t);
txt = new Text(String.valueOf(al.get(i).getCount()));
output.collect(txt_key, t);
}
}
}
答案 0 :(得分:1)
在类Reduce1中,您声明输出对象:
private OutputCollector<Text, Text> output;
没有初始化它 - &gt;所以现在它是空的。
同样在方法reduce()
中,您传递了相同类型的参数(OutputCollector<Text, Text> output
) - &gt;所以在这种方法中,我想你想说:
this.output=output;
// if the object is null, initialize it if you wanna use it
只要您的对象未初始化(实例化),您就会得到一个空指针异常。