【问题标题】:How to multiply two rdds with out using mllib in scala ?如何在 scala 中使用 mllib 将两个 rdds 相乘?
【发布时间】:2017-01-11 15:01:01
【问题描述】:

我有不使用 mllib 的矩阵加法示例代码

val result = rdd1.zip(rdd2)
    .map(y => {
     val res =  y._1.zip(y._2)
         .map { items: (Double, Double) =>
        (items._1 + items._2)
      }
      res.mkString(delimiter)
    })

请帮我把两个rdds相乘

【问题讨论】:

  • 您在上面的代码中遇到的问题是什么?请详细说明
  • 这段代码没有问题。但我不知道如何为 multiplication 做到这一点。此示例代码用于加法而不是乘法
  • 矩阵为RDD[Array[T]] 的矩阵乘法不是一个小问题(如果您实际上是指Matrix Multiplication 而不是元素乘法)。实际上,即使是可接受的解决方案,也需要付出巨大的努力。据我了解,您甚至可以忘记获得一个体面的实施,而无需花费整整 4-5 天的时间。我强烈建议您使用 mlib。
  • 原因是矩阵乘法中的各种操作需要基于索引的元素访问......这对于RDD来说非常低效。但是您可以从基于矩阵乘法的属性A(B+C) = AB+AC 的“初学者”解决方案开始。
  • @AkhilaV 我也强烈推荐使用 MLLib 的 Matrix 类。你不应该使用 collect ,因为它可能会导致驱动程序出现 OutOfMemory 并且会很慢

标签: scala apache-spark


【解决方案1】:

你可以调用这个方法得到相乘的结果。

  def mult[A](a: Array[Array[A]], b: Array[Array[A]])(implicit n: Numeric[A]): Array[Array[A]] = {
    import n._
    for (row <- a)
      yield for(col <- b.transpose)
        yield row zip col map Function.tupled(_*_) reduceLeft (_+_)
  }

Reference

【讨论】:

  • 谢谢 Jet 这是否仅适用于 Array。如何将其应用于 RDD[Array[Double]]
  • 没有。使用 collect 时将其更改为 Array 对吗?通过使用数组,它不可能使用大文件
  • @Jet 真的吗?永远不要推荐使用 collect,因为它会破坏并行性
  • 此解决方案与 Spark 不兼容。鼓励收集,除非数据集很小,并且如果数据一开始就很小,则不应使用 spark。
猜你喜欢
  • 2017-03-31
  • 2018-07-11
  • 2015-08-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多