使用 Spark 规范化列

4 scala normalize apache-spark spark-dataframe apache-spark-ml

我有一个包含三列的数据文件,我想规范化最后一列以将 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")`
Run Code Online (Sandbox Code Playgroud)

Sha*_*ica 7

StandardScaler当需要完成任何缩放/归一化时,通常使用。但是,在这种情况下,只有一列要缩放,并且它不是Vector类型(但是Float)。由于StandardScaler只对 有效Vectors,因此VectorAssembler可以先应用a ,但Vector需要Float在缩放后重新转换为 a 。

在这种情况下,更简单的方法是自己做。首先得到列的均值和标准差,然后进行缩放。它可以在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)
Run Code Online (Sandbox Code Playgroud)