如何在 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 类型的列转换为数组/字符串类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyspark中将字符串值转换为arrayType

如何在pyspark中将字符串列转换为ArrayType

pyspark 在循环中将数组转换为字符串

在 Pyspark 中将字典转换为数据框

如何在pyspark中将JSON字符串转换为JSON对象

如何在 PySpark 中将 unix 时间戳列转换为人类可理解的时间戳? [复制]