リードコード-R a n domSeedGenerator
2842 ワード
package org.apache.mahout.clustering.kmeans;
public final class RandomSeedGenerator
中心点のランダムサンプリングを完了するプロセス
hdfs操作、比較的普遍的で、先に削除してから新しい
hdfsパスフレームワークを巡る
fs.globStatus(inputPathPattern, PathFilters.logsCRCFilter());
globStatusはpatternに一致するすべてのパスを返します
logsCRCFIlterがフィルタリングされました.最初のログ、ポイントの先頭の非表示と.crcファイル
ループ時にフォルダをフィルタし、ファイルのみを処理
初期化writer
k個の容量のlistを用意して選択した値を格納する
ランダムコア-貯水池アルゴリズム
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);
}
}