scala错误:构造函数无法实例化为预期类型;

时间:2017-10-28 05:57:19

标签: scala apache-spark sparse-matrix matrix-multiplication

我试图在scala中对两个大矩阵进行矩阵乘法。以下是乘法的逻辑:

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_N_是这两个类的两个RDD:

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 个答案:

答案 0 :(得分: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

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

在构建RDD时使用它代替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)}

这将产生RDD[MatrixEntry],与加入的两个相同。