2017-02-24 148 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」:_ *'註釋(這樣的註釋只允許在*參數的參數中)「 –

相關問題