【问题标题】:Normalize column with Spark使用 Spark 规范化列
【发布时间】:2018-10-14 00:10:28
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

使用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)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 2018-05-18
  • 1970-01-01
  • 2017-10-26
  • 2011-01-17
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多