我在我的代码中使用RDD [LabeledPoint]。但现在我必须使用MinMax方法规范化数据。
我看到minMaxScaler存在于ml库中,但这适用于DataFrames:org.apache.spark.ml.feature.MinMaxScaler
。
由于已经使用RDD编写了完整的代码,我想我可以执行以下步骤,不要更改任何其他内容:
问题是我不知道怎么做。我没有列名(但LabeledPoint中的特征向量有9个维度),我也无法使其他示例适应我的情况。例如,代码在: https://stackoverflow.com/a/36909553/5081366 或Scaling each column of a dataframe
我将非常感谢您的帮助!
答案 0 :(得分:1)
最后,我能够回答我自己的问题!
其中allData
是RDD[LabeledPoint]
:
// The following import doesn't work externally because the implicits object is defined inside the SQLContext class
val sqlContext = SparkSession
.builder()
.appName("Spark In Action")
.master("local")
.getOrCreate()
import sqlContext.implicits._
// Create a DataFrame from RDD[LabeledPoint]
val all = allData.map(e => (e.label, e.features))
val df_all = all.toDF("labels", "features")
// Scaler instance above with the same min(0) and max(1)
val scaler = new MinMaxScaler()
.setInputCol("features")
.setOutputCol("featuresScaled")
.setMax(1)
.setMin(0)
// Scaling
var df_scaled = scaler.fit(df_all).transform(df_all)
// Drop the unscaled column
df_scaled = df_scaled.drop("features")
// Convert DataFrame to RDD[LabeledPoint]
val rdd_scaled = df_scaled.rdd.map(row => LabeledPoint(
row.getAs[Double]("labels"),
row.getAs[Vector]("featuresScaled")
))
我希望这能帮助别人!