Mahout:CSV来传送和运行程序

Edu*_*nal 5 java apache hadoop mahout

我正在用Mahout分析k-means算法.我将运行一些测试,观察性能,并根据我得到的结果做一些统计.

我无法弄清楚在Mahout中运行我自己的程序的方法.但是,命令行界面可能就足够了.

要运行示例程序,我这样做

$ mahout seqdirectory --input uscensus --output uscensus-seq
$ mahout seq2sparse -i uscensus-seq -o uscensus-vec
$ mahout kmeans -i reuters-vec/tfidf-vectors -o uscensus-kmeans-clusters -c uscensus-kmeans-centroids -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 5 -ow -cl -k 25
Run Code Online (Sandbox Code Playgroud)

数据集是一个大型CSV文件.每一行都是一条记录.功能以逗号分隔.第一个字段是ID.由于输入格式,我不能马上使用seqdirectory.我正在尝试实现这个类似问题的答案如何使用存储为CSV的矢量数据在mahout中执行k-means聚类?但我还有两个问题:

  1. 如何从CSV转换为SeqFile?我想我可以使用Mahout编写自己的程序进行转换,然后将其输出用作seq2parse的输入.我想我可以使用CSVIterator(https://cwiki.apache.org/confluence/display/MAHOUT/File+Format+Integrations).我应该用什么类来读写?
  2. 如何构建和运行我的新程序?我无法用Mahout这本书或其他问题来解决这个问题.

mis*_*nky 5

要以SequenceFile格式获取数据,您可以采取几种策略.两者都涉及编写自己的代码 - 即,不是严格的命令行.

策略1 使用Mahout的CSVVectorIterator类.您传递了一个java.io.Reader,它将在您的CSV文件中读取,将每一行转换为DenseVector.我从来没有使用过这个,但是在API中看到了它.如果你对DenseVectors没问题的话,看起来很直接.

策略2 编写自己的解析器.这很简单,因为你只需将每一行拆分为",",你就可以循环使用一个数组.对于每行中的每个值数组,使用以下内容实例化向量:

new DenseVector(<your array here>);
Run Code Online (Sandbox Code Playgroud)

并将其添加到List(例如).

然后......一旦你有了一个向量列表,就可以使用类似的东西将它们写入SequenceFiles(我在下面的代码中使用了NamedVectors):

FileSystem fs = null;
SequenceFile.Writer writer;
Configuration conf = new Configuration();

List<NamedVector> vectors = <here's your List of vectors obtained from CSVVectorIterator>;

// Write the data to SequenceFile
try {
    fs = FileSystem.get(conf);

    Path path = new Path(<your path> + <your filename>);
    writer = new SequenceFile.Writer(fs, conf, path, Text.class, VectorWritable.class);

    VectorWritable vec = new VectorWritable();
    for (NamedVector vector : dataVector) {

        vec.set(vector);
        writer.append(new Text(vector.getName()), vec);

    }
    writer.close();

} catch (Exception e) {
    System.out.println("ERROR: "+e);
}
Run Code Online (Sandbox Code Playgroud)

现在,您有一个SequenceFile格式的"points"目录,可用于K-means聚类.您可以将此目录中的命令行Mahout命令指定为输入.

无论如何,这是一般的想法.可能还有其他方法.