2017-10-28 2 views
0

Ich versuche dies für Matrixmultiplikation von zwei großen Matrizen in Scala zu tun. Unten ist die Logik für die Multiplikation:Scala-Fehler: Konstruktor kann nicht zum erwarteten Typ instanziiert werden;

val res = M_.map(M_ => (M_.j,M_)) 
    .join(N_.map(N_ => (N_.j, N_))) 
    .map({ case (_, ((i, v), (k, w))) => ((i, k), (v * w)) }) 
    .reduceByKey(_ + _) 
    .map({ case ((i, k), sum) => (i, k, sum) }) 

M_ und N_ sind zwei RDDs dieser beiden Klassen:

case class M_Matrix (i: Long, j: Long, v: Double) 
case class N_Matrix (j: Long, k: Long, w: Double) 

Aber ich folgende Störung erhalte:

Error image-Please open

Was mache ich hier falsch?

+1

Bitte fügen Sie der Frage mehr Code hinzu. Wie erstellen Sie die Matrizen 'M_' und' N_' und die Definition von 'M_Matrix' und' N_Matrix'. Ich fügte hinzu, was ich glaube, ist die richtige Definition (aus einer anderen Frage). – Shaido

Antwort

1

Da Ihr rdd/dateframe M_Matrix und N_Matrix Objekte enthält, können Sie nicht mit einem Tupel übereinstimmen. So etwas sollte funktionieren:

val res = M_.map(M_ => (M_.j,M_)) 
    .join(N_.map(N_ => (N_.j, N_))) 
    .map{ case (_, (m_matrix, n_matrix)) => ((m_matrix.i, n_matrix.k), m_matrix.v * n_matrix.w)} 
    .reduceByKey(_ + _) 
    .map{ case ((i, k), sum) => (i, k, sum)} 

Eine bessere Lösung als die Fall Klassen würde e MatrixEntry verwenden:

import org.apache.spark.mllib.linalg.distributed.MatrixEntry 

es Verwenden Sie statt M_Matrix und N_Matrix wenn die RDDs Gebäude, dann Die join kann wie folgt aussehen:

val res = M_.map(M_ => (M_.j,M_)) 
    .join(N_.map(N_ => (N_.i, N_))) 
    .map{ case (_, (m_matrix, n_matrix)) => ((m_matrix.i, n_matrix.j), m_matrix.value * n_matrix.value)} 
    .reduceByKey(_ + _) 
    .map{ case ((i, k), sum) => MatrixEntry(i, k, sum)} 

Dies führt zu einem RDD[MatrixEntry], genau wie die beiden, die verbunden wurden.

+0

ist dies der richtige Weg, um die RDD zu bauen? ** val M_ = sc.textFile (args (0)). map {zeile => val a = linie.split (",") MatrixEntry (a (0) .zuLang, a (1) .zuLang, a (2) .toDouble) } ** –

+0

@AvinashGayam Wenn Sie eine csv-Datei als Eingabe für die Methode haben, sollte es funktionieren. Haben Sie es versucht? – Shaido

+0

Ich habe es versucht und es hat geklappt. Vielen Dank –

Verwandte Themen