spark Vectors和scala不可变Vector之间的区别?

时间:2015-07-06 21:15:23

标签: scala hadoop apache-spark apache-spark-mllib

我正在为Scala中的Spark 1.4编写一个项目,目前我正在将我的初始输入数据转换为spark.mllib.linalg.Vectorsscala.immutable.Vector,之后我想在我的算法中使用它。有人可以简单解释两者之间的区别,在什么情况下使用它比另一种更有用?

谢谢。

1 个答案:

答案 0 :(得分:3)

spark.mllib.linalg.Vector专为线性代数应用而设计。 mllib提供了两种不同的实现 - DenseVectorSparseVector。虽然您可以访问有用的方法,例如normsqdist,但它却相当有限。

由于来自org.apache.spark.mllib.linalg的所有数据结构,它只能存储64位浮点数(scala.Double)。

如果您打算使用mllib,那么spark.mllib.linalg.Vector几乎是您唯一的选择。 mllib的所有剩余数据结构(本地和分布式)都构建在org.apache.spark.mllib.linalg.Vector之上。

否则,scala.immutable.Vector可能是更好的选择。它是一种通用的密集数据结构。

它可以存储任何类型的对象,因此您可以拥有Vector[String]

由于Traversable,您可以访问所有预期的方法,例如mapflatMapreducefoldfilter

修改:如果您需要代数操作并且不使用org.apache.spark.mllib.linalg.distributed中的任何数据结构,您可能更愿意breeze.linalg.Vector而不是spark.mllib.linalg.Vector。它支持更大的代数方法集,包括dot产品,并提供典型的集合API。