2017-02-24 2 views
1

저는 scala.collection.immutable.Vector 유형의 벡터를 가지고 있으며 org.apache.spark.ml.linalg.Vector 유형의 벡터로 변환하고 싶습니다.스칼라 벡터를 스파크 ML 벡터로 변환하는 방법?

예를 들어 다음과 같은 것을 원합니다. 단순히 val sparkVec = Vectors.dense(1,2,3)를 입력 할 수 있지만 기존 스칼라 수집 벡터를 변환 할

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

참고. 이 DenseVectors를 DataFrame에 포함시켜 spark.ml 파이프 라인에 공급하려고합니다. 다음과 같이

답변

2

Vectors.dense는 복식의 배열을 취할 수 있습니다. 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 dense (values ​​: Array [Double]) : Vector = new DenseVector (values)'라고 답해 준다. –

0

당신은 VAR-인수로 벡터 요소를 전달할 수 있습니다

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

감사 @Kuladip을, 그러나 이것은 나를 위해 작동하지 않습니다 저는 scala 2.11과 spark 2.1을 사용하고 있습니다. 나는 "no"를 얻습니다. _ * '주석은 여기에 허용됩니다 (주석은 * 매개 변수에 대한 인수에서만 허용됩니다) " –

관련 문제