package skywriting.examples.skyhout.linalg; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.DoubleWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.serializer.Serialization; import org.apache.hadoop.io.serializer.WritableSerialization; import org.apache.mahout.math.DenseVector; import org.apache.mahout.math.DenseVectorWritable; import org.apache.mahout.math.Vector; import org.apache.mahout.math.VectorWritable; import skywriting.examples.skyhout.common.SkywritingTaskFileSystem; import uk.co.mrry.mercator.task.JarTaskLoader; import uk.co.mrry.mercator.task.Task; class VectorMerger { public static DenseVector mergeInputs(SkywritingTaskFileSystem fs, int numInputs, int rank) throws IOException { // Merge the first inputs to make a new vector. DenseVector newVector = new DenseVector(new double[rank]); IntWritable currentElementIndex = new IntWritable(); DoubleWritable currentElement = new DoubleWritable(); for (int i = 0; i < numInputs; ++i) { SequenceFile.Reader mapOutputReader = new SequenceFile.Reader(fs, new Path("/in/" + i), fs.getConf()); while (true) { try { boolean hasMore = mapOutputReader.next(currentElementIndex, currentElement); if (!hasMore) break; } catch (EOFException eofe) { break; } newVector.set(currentElementIndex.get(), currentElement.get()); } mapOutputReader.close(); } return newVector; } public static DenseVector readSingleVectorFile(SkywritingTaskFileSystem fs, Path inputPath) throws IOException { SequenceFile.Reader inputReader = new SequenceFile.Reader(fs, inputPath, fs.getConf()); Text dummyKey = new Text(); DenseVectorWritable vector = new DenseVectorWritable(); boolean hasContent = inputReader.next(dummyKey, vector); assert hasContent; return vector; } public static void writeResultFile(SkywritingTaskFileSystem fs, Path outputPath, DenseVector vector) throws IOException { // Write out the resulting vector. SequenceFile.Writer resultWriter = new SequenceFile.Writer(fs, fs.getConf(), new Path("/out/0"), Text.class, DenseVectorWritable.class); resultWriter.append(new Text(), new DenseVectorWritable(vector)); resultWriter.close(); } }