【问题标题】:Spark dataframe to sparse vector with nullSpark数据帧到带有null的稀疏向量
【发布时间】:2017-08-30 17:59:38
【问题描述】:

当我尝试在 Scala.不幸的是,vectorAssembler 无法处理 null 值。

我可以做的是替换或填充数据框的 null 值,然后创建一个 dense 向量,但这不是我想要的。

所以我考虑将我的数据框行转换为 sparse 向量。但我怎样才能做到这一点?我还没有找到 vectorAssembler 制作稀疏向量的选项。

编辑:实际上我不需要 null 在稀疏向量中,但它不应该是像 0 或任何其他值,因为它是密集向量的情况。

你有什么建议吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib


    【解决方案1】:

    您可以像这样手动操作:

    import org.apache.spark.SparkException
    import org.apache.spark.ml.linalg.{Vector, Vectors}
    import org.apache.spark.sql.SparkSession
    import scala.collection.mutable.ArrayBuilder
    
    case class Row(a: Double, b: Option[Double], c: Double, d: Vector, e: Double)
    
    val dataset = spark.createDataFrame(
      Seq(new Row(0, None, 3.0, Vectors.dense(4.0, 5.0, 0.5), 7.0),
        new Row(1, Some(2.0), 3.0, Vectors.dense(4.0, 5.0, 0.5), 7.0))
    ).toDF("id", "hour", "mobile", "userFeatures", "clicked")
    
    val sparseVectorRDD = dataset.rdd.map { row =>
      val indices = ArrayBuilder.make[Int]
      val values = ArrayBuilder.make[Double]
      var cur = 0
      row.toSeq.foreach {
        case v: Double =>
          indices += cur
          values += v
          cur += 1
        case vec: Vector =>
          vec.foreachActive { case (i, v) =>
            indices += cur + i
            values += v
          }
          cur += vec.size
        case null =>
          cur += 1
        case o =>
          throw new SparkException(s"$o of type ${o.getClass.getName} is not supported.")
      }
      Vectors.sparse(cur, indices.result(), values.result())
    }
    

    如果需要,然后将其转换回数据帧。由于 Row 对象没有经过类型检查,因此您必须手动处理它并在需要时转换为适当的类型。

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2017-03-26
      • 1970-01-01
      • 2021-11-02
      • 2020-03-14
      相关资源
      最近更新 更多