如何将 Scala 向量转换为 Spark ML 向量?
How to convert scala vector to spark ML vector?
我有一个 scala.collection.immutable.Vector
类型的向量,想将其转换为 org.apache.spark.ml.linalg.Vector
.
类型的向量
例如,我想要类似下面的东西;
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 集合 Vectors。我想这样做是为了将这些 DenseVectors 嵌入到 DataFrame 中以馈入 spark.ml 管道。
您可以按如下方式将向量元素作为 var-args 传递:
val scalaVec = Vector(1, 2, 3)
val sparkVec = Vectors.dense(scalaVec:_*)
Vectors.dense 可以采用双精度数组。可能导致您遇到麻烦的是 Vectors.dense 不会接受您在示例中的 scalaVec 中使用的整数。所以以下失败:
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]
我有一个 scala.collection.immutable.Vector
类型的向量,想将其转换为 org.apache.spark.ml.linalg.Vector
.
例如,我想要类似下面的东西;
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 集合 Vectors。我想这样做是为了将这些 DenseVectors 嵌入到 DataFrame 中以馈入 spark.ml 管道。
您可以按如下方式将向量元素作为 var-args 传递:
val scalaVec = Vector(1, 2, 3)
val sparkVec = Vectors.dense(scalaVec:_*)
Vectors.dense 可以采用双精度数组。可能导致您遇到麻烦的是 Vectors.dense 不会接受您在示例中的 scalaVec 中使用的整数。所以以下失败:
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]