Spark2.2.0+Scala2.11使用ML库报错:向量类型不匹配求助
解决Spark ML中向量类型不匹配问题(org.apache.spark.ml.linalg vs org.apache.spark.mllib.linalg)
兄弟,这个坑我之前踩过!你遇到的错误本质就是Spark两套向量API的类型不兼容:你用的是Spark ML Pipeline的LogisticRegression,但features列却是旧版MLlib的向量类型,两者的VectorUDT完全不是一回事,自然会报错。
核心原因
Spark 2.x版本同时存在两套向量实现:
org.apache.spark.ml.linalg:属于新的ML Pipeline API,是DataFrame优先的设计,也是你当前使用的LogisticRegression依赖的类型org.apache.spark.mllib.linalg:属于旧的MLlib API,基于RDD设计,两套API的向量类无法直接混用
具体解决方法
方法一:把MLlib向量转换成ML向量(推荐)
如果你的features列是从旧MLlib生成的,直接用UDF把它转成ML兼容的向量类型就行:
import org.apache.spark.ml.linalg.Vectors import org.apache.spark.sql.functions.udf // 定义转换UDF:将mllib向量转为ml向量 val mllibToMlVec = udf((vec: org.apache.spark.mllib.linalg.Vector) => { Vectors.dense(vec.toArray) }) // 替换原features列为ML兼容类型 val trainingData = dataSet .select(mllibToMlVec(col("features")).alias("features"), col("label")) .cache()
方法二:全程使用ML库的向量生成API
如果你是自己生成特征向量,直接用ML Pipeline的工具类,避免接触旧版MLlib的向量:
import org.apache.spark.ml.feature.VectorAssembler // 假设你的原始特征列是col1、col2、col3 val assembler = new VectorAssembler() .setInputCols(Array("col1", "col2", "col3")) .setOutputCol("features") // 生成ML兼容的features列 val dataSetWithMlFeatures = assembler.transform(originalDataSet) val trainingData = dataSetWithMlFeatures .select(col("features"), col("label")) .cache()
额外注意事项
- 检查所有导入语句:别不小心导入
org.apache.spark.mllib.linalg._,如果必须用,要明确指定类的全路径,避免和ML库的类冲突 - Spark 2.x之后官方推荐使用ML Pipeline API,旧版MLlib会逐步被废弃,尽量全程用ML的工具类,从根源避免类型问题
内容的提问来源于stack exchange,提问作者秦时明月
相关产品推荐
相关产品推荐

