2017-10-28 3 views
0

私はスカラーで2つの大きな行列の行列乗算のためにこれをしようとしています。以下は、乗算のための論理です:scala error:コンストラクタを予期した型にインスタンス化できません。

​​

M_N_は、この2つのクラスの2 RDDSです:

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

しかし、私は次のエラーを取得しています:

Error image-Please open

私はここで間違って何をしていますか?

+1

質問にさらにコードを追加してください。 'M_'と' N_'行列と 'M_Matrix'と' N_Matrix'の定義をどうやって作りますか?私は正しい定義(別の質問から)と信じているものを追加しました。 – Shaido

答えて

1

rdd/dataframeにはM_MatrixN_Matrixオブジェクトが含まれているため、タプルと一致させることはできません。このような何か作業をする必要があります:

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)} 

電子しまうケースクラスを使用するよりも、よりよい解決策がMatrixEntryを使用する:RDDSを構築する際

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

M_MatrixN_Matrixの代わりにそれを使用して、その後、 joinは次のようになります。

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)} 

これにより、参加した2人と同じRDD[MatrixEntry]になります。

+0

これはrddを構築する正しい方法ですか? ** val M_ = sc.textFile(args(0))。map {line => val a = line.split( "、") MatrixEntry(a(0).toLong、a(1).toLong、a (2).toDouble) } ** –

+0

@AvinashGayamメソッドへの入力としてcsvファイルがある場合、それは動作するはずです。試しましたか? – Shaido

+0

私はそれを試して、それがうまくいった。ありがとうございました –

関連する問題