2012-03-05 7 views
7

Sto imparando Mahout e sto leggendo "Mahout in azione".Ottenere un IOException quando si esegue un codice di esempio in "Mahout in azione" su mahout-0.6

Quando ho provato a eseguire il codice di esempio in chapter7 SimpleKMeansClustering.java, un'eccezione spuntato:

Exception in thread "main" java.io.IOException: errata value class: 0.0: null non è org classe .apache.mahout.clustering.WeightedPropertyVectorWritable a org.apache.hadoop.io.SequenceFile $ Reader.next (SequenceFile.java:1874) a SimpleKMeansClustering.main (SimpleKMeansClustering.java:95)

ho successed questo codice su mahout -0,5, ma su mahout-0,6 ho visto questa eccezione. Anche se ho cambiato il nome della directory da Cluster-0 a Clusters-0-Final, sto ancora affrontando questa eccezione.

KMeansDriver.run(conf, vectors, new Path(canopyCentroids, "clusters-0-final"), clusterOutput, new TanimotoDistanceMeasure(), 0.01, 20, true, false);//First, I changed this path. 

    SequenceFile.Reader reader = new SequenceFile.Reader(fs, new Path("output/clusters/clusteredPoints/part-m-00000"), conf);//I double checked this folder and filename. 

    IntWritable key = new IntWritable(); 
    WeightedVectorWritable value = new WeightedVectorWritable(); 
    int i=0; 
    while(reader.next(key, value)) { 
     System.out.println(value.toString() + " belongs to cluster " + key.toString()); 
     i++; 
    } 
    System.out.println(i); 
    reader.close(); 

Qualcuno ha qualche idea su questa eccezione? Ho cercato di risolverlo da molto tempo e non ne ho idea. E ci sono poche fonti su internet.

Grazie in anticipo

+1

E di solito significa che il vostro ingresso è vuota o malformati. Nota anche che il libro va con Mahout 0.5, anche se, in generale, non mi aspetterei problemi usando gli esempi con 0.6. Non posso dire per certo però. –

+0

Grazie, Sean Owen. Allora andrò con Mahout 0.5. :) – Nebulach

risposta

4

Per fare questo esempio lavoro Mahout 0.6, aggiungono

import org.apache.mahout.clustering.WeightedPropertyVectorWritable; 

alle importazioni e sostituire la riga:

WeightedVectorWritable value = new WeightedVectorWritable(); 

da

WeightedPropertyVectorWritable value = new WeightedPropertyVectorWritable(); 

T ciò accade perché il codice Mahout 0.6 scrive i valori di output del clustering nel nuovo tipo WeightedPropertyVectorWritable.

2

L'esempio nel libro funziona bene per mahout 05 con le seguenti piccole modifiche:

(1) impostare i percorsi correttamente:

KMeansDriver.run(conf, new Path("testdata/points"), new Path("testdata/clusters"), new Path("testdata/output"), new EuclideanDistanceMeasure(), 0.001, 10, true, false); 

e

SequenceFile.Reader reader = new SequenceFile.Reader(fs, new Path("testdata/output/clusteredPoints/part-m-0"), conf); 

(2) anche se non hai installato HADOOP, devi modificare l'ultimo parametro della chiamata KMeansDriver.run() da 'false' a 'true'.

KMeansDriver.run(conf, new Path("testdata/points"), new Path("testdata/clusters"), new Path("testdata/output"), new EuclideanDistanceMeasure(), 0.001, 10, true, true); 

Quindi l'esempio funziona.

0

Sostituire

import org.apache.mahout.clustering.WeightedVectorWritable; 

con

import org.apache.mahout.clustering.classify.WeightedVectorWritable; 
3

A chi può interessare, ecco un campione MiA lavorare per mahout 0.9:

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.SequenceFile; 
import org.apache.hadoop.io.Text; 
import org.apache.mahout.clustering.Cluster; 
import org.apache.mahout.clustering.classify.WeightedPropertyVectorWritable; 
import org.apache.mahout.clustering.kmeans.KMeansDriver; 
import org.apache.mahout.clustering.kmeans.Kluster; 
import org.apache.mahout.common.distance.EuclideanDistanceMeasure; 
import org.apache.mahout.math.RandomAccessSparseVector; 
import org.apache.mahout.math.Vector; 
import org.apache.mahout.math.VectorWritable; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class SimpleKMeansClustering { 

    public static final double[][] points = { 
      {1, 1}, {2, 1}, {1, 2}, 
      {2, 2}, {3, 3}, {8, 8}, 
      {9, 8}, {8, 9}, {9, 9}}; 

    public static void writePointsToFile(List<Vector> points, 
             String fileName, 
             FileSystem fs, 
             Configuration conf) throws IOException { 
     Path path = new Path(fileName); 
     SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf, 
       path, LongWritable.class, VectorWritable.class); 
     long recNum = 0; 
     VectorWritable vec = new VectorWritable(); 
     for (Vector point : points) { 
      vec.set(point); 
      writer.append(new LongWritable(recNum++), vec); 
     } 
     writer.close(); 
    } 

    public static List<Vector> getPoints(double[][] raw) { 
     List<Vector> points = new ArrayList<Vector>(); 
     for (int i = 0; i < raw.length; i++) { 
      double[] fr = raw[i]; 
      Vector vec = new RandomAccessSparseVector(fr.length); 
      vec.assign(fr); 
      points.add(vec); 
     } 
     return points; 
    } 

    public static void main(String args[]) throws Exception { 

     int k = 2; 

     List<Vector> vectors = getPoints(points); 

     File testData = new File("clustering/testdata"); 
     if (!testData.exists()) { 
      testData.mkdir(); 
     } 
     testData = new File("clustering/testdata/points"); 
     if (!testData.exists()) { 
      testData.mkdir(); 
     } 

     Configuration conf = new Configuration(); 
     FileSystem fs = FileSystem.get(conf); 
     writePointsToFile(vectors, "clustering/testdata/points/file1", fs, conf); 

     Path path = new Path("clustering/testdata/clusters/part-00000"); 
     SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf, path, Text.class, Kluster.class); 

     for (int i = 0; i < k; i++) { 
      Vector vec = vectors.get(i); 
      Kluster cluster = new Kluster(vec, i, new EuclideanDistanceMeasure()); 
      writer.append(new Text(cluster.getIdentifier()), cluster); 
     } 
     writer.close(); 

     KMeansDriver.run(conf, 
       new Path("clustering/testdata/points"), 
       new Path("clustering/testdata/clusters"), 
       new Path("clustering/output"), 
       0.001, 
       10, 
       true, 
       0, 
       true); 

     SequenceFile.Reader reader = new SequenceFile.Reader(fs, 
       new Path("clustering/output/" + Cluster.CLUSTERED_POINTS_DIR + "/part-m-0"), conf); 

     IntWritable key = new IntWritable(); 
     WeightedPropertyVectorWritable value = new WeightedPropertyVectorWritable(); 
     while (reader.next(key, value)) { 
      System.out.println(value.toString() + " belongs to cluster " + key.toString()); 
     } 
     reader.close(); 
    } 

} 
+0

Wow!Grazie mille ha funzionato! Ho eseguito il debug del codice di esempio per 0,7 ore ora. – nilsi

Problemi correlati