リードコード-R a n domSeedGenerator

2842 ワード

package org.apache.mahout.clustering.kmeans;
public final class RandomSeedGenerator
中心点のランダムサンプリングを完了するプロセス
hdfs操作、比較的普遍的で、先に削除してから新しい

    FileSystem fs = FileSystem.get(output.toUri(), conf);
    HadoopUtil.delete(conf, output);
    Path outFile = new Path(output, "part-randomSeed");
    boolean newFile = fs.createNewFile(outFile);

hdfsパスフレームワークを巡る
fs.globStatus(inputPathPattern, PathFilters.logsCRCFilter());
globStatusはpatternに一致するすべてのパスを返します
logsCRCFIlterがフィルタリングされました.最初のログ、ポイントの先頭の非表示と.crcファイル
ループ時にフォルダをフィルタし、ファイルのみを処理

    if (newFile) {
      Path inputPathPattern;

      if (fs.getFileStatus(input).isDir()) {
        inputPathPattern = new Path(input, "*");
      } else {
        inputPathPattern = input;
      }
      
      FileStatus[] inputFiles = fs.globStatus(inputPathPattern, PathFilters.logsCRCFilter());
      for (FileStatus fileStatus : inputFiles) {
        if (fileStatus.isDir()) {
          continue;
        }
        //process file
      }
      
    }

初期化writer
k個の容量のlistを用意して選択した値を格納する

      SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, outFile, Text.class, Cluster.class);
      Random random = RandomUtils.getRandom();
      List<Text> chosenTexts = new ArrayList<Text>(k);
      List<Cluster> chosenClusters = new ArrayList<Cluster>(k);
      int nextClusterId = 0;

ランダムコア-貯水池アルゴリズム

        for (Pair<Writable,VectorWritable> record
             : new SequenceFileIterable<Writable,VectorWritable>(fileStatus.getPath(), true, conf)) {
          Writable key = record.getFirst();
          VectorWritable value = record.getSecond();
          Cluster newCluster = new Cluster(value.get(), nextClusterId++, measure);
          newCluster.observe(value.get(), 1);
          Text newText = new Text(key.toString());
          int currentSize = chosenTexts.size();
          if (currentSize < k) {
            chosenTexts.add(newText);
            chosenClusters.add(newCluster);
          } else if (random.nextInt(currentSize + 1) == 0) { // with chance 1/(currentSize+1) pick new element
            int indexToRemove = random.nextInt(currentSize); // evict one chosen randomly
            chosenTexts.remove(indexToRemove);
            chosenClusters.remove(indexToRemove);
            chosenTexts.add(newText);
            chosenClusters.add(newCluster);
          }
        }