如何在 PySpark 中将 Vector 类型的列转换为数组/字符串类型?
Posted
技术标签:
【中文标题】如何在 PySpark 中将 Vector 类型的列转换为数组/字符串类型?【英文标题】:How to convert a column of type Vector to array/string type in PySpark? 【发布时间】: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 |
+-----------+-----------+
提前致谢!
【问题讨论】:
【参考方案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 ,请告诉我以上是关于如何在 PySpark 中将 Vector 类型的列转换为数组/字符串类型?的主要内容,如果未能解决你的问题,请参考以下文章