我刚刚使用了Standard Scaler对我的机器学习应用程序的特征进行归一化。在选择经过缩放的特征之后,我希望将其转换为Double类型的数据帧,尽管我的向量长度是任意的。我知道如何针对三个特定的特征执行此操作,方法是使用
myDF.map{case Row(v: Vector) => (v(0), v(1), v(2))}.toDF("f1", "f2", "f3")
但不适用于任意数量的特征。有没有简单的方法可以做到这一点?
示例:
val testDF = sc.parallelize(List(Vectors.dense(5D, 6D, 7D), Vectors.dense(8D, 9D, 10D), Vectors.dense(11D, 12D, 13D))).map(Tuple1(_)).toDF("scaledFeatures")
val myColumnNames = List("f1", "f2", "f3")
// val finalDF = DataFrame[f1: Double, f2: Double, f3: Double]
编辑
我发现在创建数据框时如何解压缩列名,但仍然有困难将向量转换为创建数据框所需的序列:
finalDF = testDF.map{case Row(v: Vector) => v.toArray.toSeq /* <= this errors */}.toDF(List("f1", "f2", "f3"): _*)
VectorDisassembler
未被纳入 Spark(SPARK-13610)。 - Alper t. Turker