scala在数据输入模型前,用VectorAssembler函数将特征转化为向量,但是扔进模型fit时报错: org.apache.spark.ml.linalg.SparseVector cannot be cast to org.apache.spark.ml.linalg.DenseVector
查看数据发现,VectorAssembler在转化时,全为0的行数据会被转化为稀疏向量(sparse vector), 非全为0的数据是dense 向量(参考:(3条消息) spark中稀疏向量转密集向量_spark 密集向量_陈大豆的博客-CSDN博客), 那么如何将dataFrame的一列VectorAssembler转化完成的feature列全部转化为稠密向量呢? 尝试了很多方法,最后成功的做法很简单,用UDF转换,代码如下
val assembler = new VectorAssembler()
.setInputCols(Array("col_c1","col_c2"))
.setOutputCol("features")
// 结果feature列col_c1,col_c2全为0的行会被转化为稀疏向量(sparse vector)
trainData= assembler.transform(trainData)
def toDense(col1: Vector): Vector = {
col1.toDense
}
val toDenseUdf = udf(toDense _)
// trainData 结果feature列会全部转化为稠密向量(dense vector) 输入模型就不会报错了
trainData= trainData.withColumn("features", toDenseUdf(col("features")))