我正在为Scala中的Spark 1.4编写一个项目,目前我正在将我的初始输入数据转换为spark.mllib.linalg.Vectors
和scala.immutable.Vector
,之后我想在我的算法中使用它。有人可以简单解释两者之间的区别,在什么情况下使用它比另一种更有用?
谢谢。
答案 0 :(得分:3)
spark.mllib.linalg.Vector
专为线性代数应用而设计。 mllib
提供了两种不同的实现 - DenseVector
,SparseVector
。虽然您可以访问有用的方法,例如norm
或sqdist
,但它却相当有限。
由于来自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
,您可以访问所有预期的方法,例如map
,flatMap
,reduce
,fold
,filter
等
修改:如果您需要代数操作并且不使用org.apache.spark.mllib.linalg.distributed
中的任何数据结构,您可能更愿意breeze.linalg.Vector
而不是spark.mllib.linalg.Vector
。它支持更大的代数方法集,包括dot
产品,并提供典型的集合API。