【问题标题】:How to convert VectorAssembler output which is Vector type to Array如何将向量类型的 VectorAssembler 输出转换为数组
【发布时间】:2021-03-22 00:22:22
【问题描述】:

spark 中的vectorAssembler 函数提供了一个vector[double] 类型作为输出,但我需要将其转换为array[double]。 我知道提供了一个 inbuild Vector_to_array 函数,但我不知道如何将列转换为数组 一些元素也是稀疏数组。

var assembler = new VectorAssembler().setInputCols(Array("Pclass",
  "Age",
  "Fare",
  "Gender",
  "Boarded"
)).setOutputCol("features")
var transformedDF =  assembler.setHandleInvalid("skip").transform(updatedDF)

这是代码,我需要将特征列从向量转换为数组类型。

【问题讨论】:

    标签: apache-spark apache-spark-sql apache-spark-mllib


    【解决方案1】:

    根据 ml 或 mllib 库为 Vector 使用别名,以免与 Scala 的 Vector 混淆

    import org.apache.spark.ml.linalg.Vector => MLVector
    import org.apache.spark.mllib.linalg.Vector => MLlibVector
    

    然后创建一个UDF

    // 1. function to map to Array[Double]
    val vec2Array: Any => Array[Double] = {
      vector => vector match {
        case vec: MLVector => vec.toArray
        case vec: MLlibVector => vec.toArray
      }
    }
    // 2. User Defined Function (UDF)
    val vec2ArrayUDF = udf(vec2Array)
    // 3. apply UDF on "features" column
    val df_vec2Array = transformedDF.withColumn("features_array",vec2ArrayUDF(col("features")))  
    

    【讨论】:

    • 非常感谢。这真的很有帮助,你能告诉我在哪里可以学习 udf,我不太了解 bgrd 中发生了什么。谢谢
    • 当然,udf 实际上就是这 3 个步骤:1. 定义 Scala 函数,2. 将其放入 udf() 中,3. 将其应用于 DF。首先,这个介绍很好 jaceklaskowski.gitbooks.io/mastering-spark-sql/content/…,要获得更深入的信息,我可以推荐“Spark:权威指南”第 6 章处理不同类型的数据,用户定义的函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多