Spark中如何将Array[Vector]转换为Array[(Double, Double)]
解决Spark MLlib K-Means聚类中心格式转换问题
你的代码错误在于模式匹配写法完全不符合Scala语法——case Vector => (Double, Double)既没有正确提取Vector中的元素,Double也只是类型名而非实际取值。
正确的转换方式
假设你的聚类中心是二维向量(对应目标格式Array[(Double, Double)]),可以直接通过Vector的apply方法提取对应位置的元素:
val k_means = new KMeans().setK(k).setSeed(1L) val kmModel = k_means.fit(transformedData) val clusterVector = kmModel.clusterCenters // 提取每个二维向量的两个元素,转换为Tuple类型 val clusters: Array[(Double, Double)] = clusterVector.map(vec => (vec(0), vec(1)))
更严谨的模式匹配写法(针对DenseVector)
如果明确知道聚类中心是DenseVector类型,可以用模式匹配更清晰地提取元素:
import org.apache.spark.ml.linalg.DenseVector val clusters: Array[(Double, Double)] = clusterVector.map { case DenseVector(x, y) => (x, y) }
注意事项
- 必须确保所有聚类中心都是二维向量,否则
vec(0)或vec(1)会抛出数组越界异常 - 如果使用Spark MLlib旧版(基于
org.apache.spark.mllib.linalg.Vector),写法逻辑一致,仅需调整导入的包路径
内容的提问来源于stack exchange,提问作者Roni Purolainen
相关产品推荐
相关产品推荐

