Hadoop输入SequenceFile的矩阵乘法



我正在运行MapReduce Matrix Multiplication.java程序,该程序在这个网站http://www.norstad.org/matrix-multiply/index.html上找到。
(源代码见网站末尾)

当我执行它时,它说输入不是一个SequenceFile

我的输入文件是最近的inputA.txt,它看起来像这样

A,0,1,1.0
A,0,2,2.0
A,0,3,3.0
A,0,4,4.0
A,1,0,5.0
A,1,1,6.0
A,1,2,7.0
A,1,3,8.0
A,1,4,9.0

,格式为:MatrixName, row, col, element
当然,这行不通。

我真的想运行这个源代码,因为它的算法。那么,在这种情况下,我如何生成正确的SequenceFile ?
我可以从我已经拥有的。txt文件生成它吗?

查看TestMatrixMultiply中包含的测试代码(在您提供的链接中)应该会给您一些工作。

我已经把相关的部分抽出来让你开始。这个(未经测试的)代码应该创建两个序列文件(参见testIdentity())。

您可以在writeMatrix方法中看到它如何创建一个SequenceFile和使用的结构,我假设它与实际的mapreduce作业使用的结构相同。

您可以扩展此代码以读取文本文件,正确填充2D矩阵数组,然后编写Sequence文件。

public class TestMatrixMultiply {
    private static final String DATA_DIR_PATH = "/tmp/MatrixMultiply";
    private static final String INPUT_PATH_A = DATA_DIR_PATH + "/A";
    private static final String INPUT_OATH_B = DATA_DIR_PATH + "/B";
    private static Configuration conf = new Configuration();
    private static FileSystem fs;
    public static void writeMatrix (int[][] matrix, 
              int rowDim, int colDim, String pathStr) throws IOException {
        Path path = new Path(pathStr);
        SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, path, 
        MatrixMultiply.IndexPair.class, IntWritable.class, 
        SequenceFile.CompressionType.NONE);
        MatrixMultiply.IndexPair indexPair = new MatrixMultiply.IndexPair();
        IntWritable el = new IntWritable();
        for (int i = 0; i < rowDim; i++) {
            for (int j = 0; j < colDim; j++) {
                int v = matrix[i][j];
                if (v != 0) {
                    indexPair.index1 = i;
                    indexPair.index2 = j;
                    el.set(v);
                    writer.append(indexPair, el);
                }
            }
        }
        writer.close();
    }
    public static void main (String[] args) throws Exception {
        new GenericOptionsParser(conf, args);
        fs = FileSystem.get(conf);
        fs.mkdirs(new Path(DATA_DIR_PATH));
        A = new int[][] { {1,0}, {0,1}};
        B = new int[][] { {1,0}, {0,1}};
        writeMatrix(A, 2, 2, INPUT_PATH_A);
        writeMatrix(B, 2, 2, INPUT_OATH_B);
    }
}

您应该注意,这种方法适用于少量数据。一旦您开始达到任何规模,您可能想要编写一个mapreduce作业,它将您的文本文件作为输入,并写出一个序列文件。

最新更新