0
public class classifyTweet {

  public static class MapClass 
          extends Mapper<LongWritable, Text, Text, Text> {

  static final Configuration conf = new Configuration();

  protected void map(LongWritable key, Text value, Context context) 
             throws IOException, InterruptedException {

  StandardNaiveBayesClassifier classifier = new StandardNaiveBayesClassifier(NaiveBayesModel.materialize(new Path(modelPath), conf));

    }
  }
 }

分類子変数を一度だけ初期化したいのですが、具体化メソッドが IOEception をスローしています。マップ メソッドの外で宣言すると、構成オブジェクトの初期化のように IOException のコンパイル エラーが発生します。一度だけ初期化するにはどうすればよいですか?

4

2 に答える 2

1

make StandardNaiveBayesClassifier - シングルトン

public class StandardNaiveBayesClassifier {
private static StandardNaiveBayesClassifier instance;

public static StandardNaiveBayesClassifier getInstance(... you params) {
    if (instance == null)
        instance = new StandardNaiveBayesClassifier();
    return instance;
}

private StandardNaiveBayesClassifier() {
}

}

于 2013-06-24T08:32:52.223 に答える
1

静的ブロックを使用して、classifier変数を一度だけ初期化できます。

public class classifyTweet {

  public static class MapClass 
          extends Mapper<LongWritable, Text, Text, Text> {

  static final Configuration conf = new Configuration();

  static final StandardNaiveBayesClassifier classifier;

  static {
      try {
       classifier = new StandardNaiveBayesClassifier(NaiveBayesModel.materialize(new Path(modelPath), conf));
      }
      catch(IOException e) {
          e.printStackTrace();
          System.out.println("Initialization failed.");
      }
  }

  protected void map(LongWritable key, Text value, Context context) 
             throws IOException, InterruptedException {

  //do some work...

    }
  }
 }

静的ブロックでオブジェクトをmodelPath作成するときに、変数がスコープ内にあると想定しています。classifierあなたはそれについて何も言わない。

于 2013-06-24T08:33:42.807 に答える