【问题标题】:How to convert a column of type Vector to array/string type in PySpark?如何在 PySpark 中将 Vector 类型的列转换为数组/字符串类型?
【发布时间】:2020-03-03 19:01:45
【问题描述】:

在 pyspark 中考虑以下数据框:

+-----------+
|      Col A|
+-----------+
| [0.5, 0.6]|                  
| [0.7, 0.8]|                   
| [1.1, 1.5]|                                 
+-----------+

Col A 的类型是向量,我怎样才能创建一个新列,它的值是 Col A 但类型是数组或字符串?

df:

+-----------+-----------+
|Col A      |new_column |
+-----------+-----------+
| [0.5, 0.6]|  0.5, 0.6 |               
| [0.7, 0.8]|  0.7, 0.8 |            
| [1.1, 1.5]|  1.1, 1.5 |                         
+-----------+-----------+

提前致谢!

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    如果您只想将 Vector 转换为 Array[Double],使用 UDF 非常简单:

    import org.apache.spark.ml.linalg.DenseVector
    val toArr: Any => Array[Double] = _.asInstanceOf[DenseVector].toArray
    val toArrUdf = udf(toArr)
    val dataWithFeaturesArr = dataWithFeatures.withColumn("A_arr",toArrUdf('COl A'))
    

    【讨论】:

    • 它抱怨语法无效
    【解决方案2】:

    可能的解决方案是:

    scala> output.show
    +---+---------+
    | id|vectorCol|
    +---+---------+
    |  0|[1.2,1.3]|
    |  1|[2.2,2.3]|
    |  2|[3.2,3.3]|
    +---+---------+
    
    
    scala> output.printSchema
    root
     |-- id: integer (nullable = false)
     |-- vectorCol: vector (nullable = true)
    
    
    scala> import org.apache.spark.ml.linalg.DenseVector
    import org.apache.spark.ml.linalg.DenseVector
    
    scala> val toArr: Any => Array[Double] = _.asInstanceOf[DenseVector].toArray
    toArr: Any => Array[Double] = <function1>
    
    scala> val toArrUdf = udf(toArr)
    toArrUdf: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,ArrayType(DoubleType,false),None)
    
    scala> val df1 = output.withColumn("features_arr",toArrUdf('vectorCol))
    
    scala> df1.show
    +---+---------+------------+
    | id|vectorCol|features_arr|
    +---+---------+------------+
    |  0|[1.2,1.3]|  [1.2, 1.3]|
    |  1|[2.2,2.3]|  [2.2, 2.3]|
    |  2|[3.2,3.3]|  [3.2, 3.3]|
    +---+---------+------------+
    
    scala> df1.printSchema
    root
     |-- id: integer (nullable = false)
     |-- vectorCol: vector (nullable = true)
     |-- features_arr: array (nullable = true)
     |    |-- element: double (containsNull = false)
    

    link. 中可以看到 pyspark 中的一个可能实现

    如果有帮助请告诉我!!

    【讨论】:

    • 嘿,感谢您的回复,pysaprk 的链接他们使用的 vector_to_array 函数不起作用,我找不到任何文档..
    • @tia 在同一个链接中,还有其他可能的答案。如果您能找到 spark ,请告诉我
    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2020-08-03
    • 2018-04-07
    • 2023-01-18
    相关资源
    最近更新 更多