Spark:将RDD [LabeledPoint]转换为Dataframe以应用MinMaxScaler,并在缩放后获得规范化的RDD [LabeledPoint]

时间:2018-05-10 13:28:21

标签: scala apache-spark

我在我的代码中使用RDD [LabeledPoint]。但现在我必须使用MinMax方法规范化数据。

我看到minMaxScaler存在于ml库中,但这适用于DataFrames:org.apache.spark.ml.feature.MinMaxScaler

由于已经使用RDD编写了完整的代码,我想我可以执行以下步骤,不要更改任何其他内容:

  1. 将RDD [LabeledPoint]转换为DataFrame
  2. 将MinMaxScaler应用于DataFrame
  3. 将DataFrame转换为RDD [LabeledPoint]
  4. 问题是我不知道怎么做。我没有列名(但LabeledPoint中的特征向量有9个维度),我也无法使其他示例适应我的情况。例如,代码在: https://stackoverflow.com/a/36909553/5081366Scaling each column of a dataframe

    我将非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

最后,我能够回答我自己的问题!

其中allDataRDD[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")
    ))

我希望这能帮助别人!