Как преобразовать столбец типа Vector в массив / строковый тип в PySpark? - PullRequest
1 голос
/ 03 марта 2020

Рассмотрим следующий фрейм данных в pyspark:

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

Тип Col A является вектором, как я могу создать новый столбец, который имеет значения Col A, но имеет тип array или string?

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 |                         
+-----------+-----------+

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Если вы просто хотите конвертировать 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'))
0 голосов
/ 03 марта 2020

Возможное решение может быть:

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)

Возможную реализацию в pyspark можно увидеть по этой ссылке .

Дайте мне знать, если это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...