我正在Scala中为Spark 1.4编写一个项目,目前正在将我的初始输入数据转换为spark.mllib.linalg.Vectors
和scala.immutable.Vector
之间,我后来想在我的算法中使用。有人能简单解释一下两者之间的区别吗?在什么情况下,一个比另一个更有用?
谢谢。
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
等。
Edit:如果您需要代数运算,并且不使用org.apache.spark.mllib.linalg.distributed
中的任何数据结构,您可能更喜欢breeze.linalg.Vector
而不是spark.mllib.linalg.Vector
。它支持包括dot
乘积在内的更大的代数方法集,并提供典型的集合API。