Как упоминалось в комментарии, проблема заключается в том, что значения не относятся к типу Double.
val a = df.select("id", "start_ts", "duration", "ip_dist").map(r => (r.getInt(0), Vectors.dense(r.getDouble(1), r.getDouble(2), r.getDouble(3)))).toDF("id", "features")
Либо приведен к типу Correct DataType, то есть к типу Long (вы также можете указатьСхема явно использует Case Class и применяет схему к DataFrame).
Или используйте VectorAssembler для преобразования столбцов в объекты.Это более простой и рекомендуемый подход.
import org.apache.spark.ml.feature.VectorAssembler
def inputKmeans(df: DataFrame,spark: SparkSession): DataFrame = {
val assembler = new VectorAssembler().setInputCols(Array("start_ts", "duration", "ip_dist")).setOutputCol("features")
val output = assembler.transform(df).select("id", "features")
output
}