使用Spark标准化列

时间:2018-05-03 15:45:48

标签: scala apache-spark spark-dataframe apache-spark-ml normalize

我有一个包含三列的数据文件,我想规范化最后一列以将ALS应用于ML(Spark和Scala),我该怎么做?

以下是我Dataframe的摘录:

val view_df = spark.createDataFrame(view_RDD, viewSchema)
val viewdd = view_df.withColumn("userIdTemp", view_df("userId").cast(IntegerType)).drop("userId")
                    .withColumnRenamed("userIdTemp", "userId")
                    .withColumn("productIdTemp", view_df("productId").cast(IntegerType)).drop("productId")
                    .withColumnRenamed("productIdTemp", "productId")
                    .withColumn("viewTemp", view_df("view").cast(FloatType)).drop("view")
                    .withColumnRenamed("viewTemp", "view")`

1 个答案:

答案 0 :(得分:3)

当要进行任何缩放/规范化时,通常使用StandardScaler。但是,在这种情况下,只有一列可以扩展,而且它不属于Vector类型(但Float)。由于StandardScaler仅适用于Vectors,因此可以先应用VectorAssembler,但在缩放后需要将Vector重新转换为Float

在这种情况下,更简单的方法是自己动手。首先得到列的平均值和标准偏差,然后执行缩放。它可以在view列上完成,如下所示:

val (mean_view, std_view) = viewdd.select(mean("view"), stddev("view"))
  .as[(Double, Double)]
  .first()
viewdd.withColumn("view_scaled", ($"view" - mean_view) / std_view)