2017-02-24 2 views
1

私はタイプscala.collection.immutable.Vectorのベクトルを持っていて、タイプorg.apache.spark.ml.linalg.Vectorのベクトルに変換したいと思います。スカラーベクトルをMLベクトルに変換するには?

たとえば、次のようなものが必要です。私は単にval sparkVec = Vectors.dense(1,2,3)を入力することができますが、私は、既存のScalaのコレクションのベクトルを変換したい

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

注意。私は、これらのDenseVectorをDataFrameに埋め込んでspark.mlパイプラインに供給したいと考えています。

答えて

2

Vectors.denseはdoubleの配列を取ることができます。おそらく、Vectors.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!これは確かに問題でした。ソースコードを見ると、あなたが何を答えているかを確認する '' dense(values:Array [Double]):Vector = new DenseVector(values)」と表示されます。 –

0

次のようにして、VAR-引数としてベクトル要素を渡すことができます。

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

おかげ@Kuladipを、これは私のために動作しません。私はスカラ2.11とスパーク2.1を使用しています。私は "no"を取得します:_ * '注釈は許可されています(そのような注釈は* -parametersの引数でのみ許可されます) " –

関連する問題