2017-02-24 127 views
1

我有一个类型scala.collection.immutable.Vector的矢量图,并且想将其转换为类型为org.apache.spark.ml.linalg.Vector的矢量。如何将scala矢量转换为spark ML矢量?

例如,我想要类似以下的东西;

import org.apache.spark.ml.linalg.Vectors 
val scalaVec = Vector(1,2,3) 
val sparkVec = Vectors.dense(scalaVec) 

注意,我可以简单地键入val sparkVec = Vectors.dense(1,2,3)但我想将现有的Scala集合载体。我想要做到这一点,将这些DenseVectors嵌入到DataFrame中以供入spark.ml流水线。

回答

2

Vectors.dense可以采取双打的阵列。可能是什么导致你的麻烦是Vector.dense不会接受你在例子中用在scalaVec中的Ints。所以下面的失败:

val test = Seq(1,2,3,4,5).to[scala.Vector].toArray 
Vectors.dense(test) 

import org.apache.spark.ml.linalg.Vectors 
test: Array[Int] = Array(1, 2, 3, 4, 5) 
<console>:67: error: overloaded method value dense with alternatives: 
    (values: Array[Double])org.apache.spark.ml.linalg.Vector <and> 
    (firstValue: Double,otherValues: Double*)org.apache.spark.ml.linalg.Vector cannot be applied to (Array[Int]) 
    Vectors.dense(test) 

虽然这个工程:

val testDouble = Seq(1,2,3,4,5).map(x=>x.toDouble).to[scala.Vector].toArray 
Vectors.dense(testDouble) 

testDouble: Array[Double] = Array(1.0, 2.0, 3.0, 4.0, 5.0) 
res11: org.apache.spark.ml.linalg.Vector = [1.0,2.0,3.0,4.0,5.0] 
+0

Thanks @ pwb2103!这确实是问题所在。查看源代码显示'def dense(values:Array [Double]):Vector = new DenseVector(values)'确认你已经回答了什么。 –

0

可以通过向量元素作为VAR-ARGS如下:

val scalaVec = Vector(1, 2, 3) 
val sparkVec = Vectors.dense(scalaVec:_*) 
+0

谢谢@Kuladip,但这并不为我工作;我正在使用scala 2.11和spark 2.1。我在这里得到了“no”:_ *'注释(这样的注释只允许在*参数的参数中)“ –