scala error: constructor cannot be instantiated to expected type;
scala error: constructor cannot be instantiated to expected type;
我正在尝试对 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
我做错了什么?
由于您的 rdd/dataframe 包含 M_Matrix
和 N_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_Matrix
和 N_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]
,与合并的两个相同。
我正在尝试对 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_
是这两个 类:
case class M_Matrix ( i: Long, j: Long, v: Double )
case class N_Matrix ( j: Long, k: Long, w: Double )
但我收到以下错误:
Error image-Please open
我做错了什么?
由于您的 rdd/dataframe 包含 M_Matrix
和 N_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_Matrix
和 N_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]
,与合并的两个相同。