/ Как да конвертирате ArrayType в DenseVector в PySpark DataFrame? - питон, apache-spark, pyspark, apache-spark-mllib, apache-spark-ml

Как да конвертирате ArrayType в DenseVector в PySpark DataFrame? - питън, apache-spark, pyspark, apache-spark-mllib, apache-spark-ml

Аз получавам следната грешка, опитвайки се да изградя ML Pipeline:

pyspark.sql.utils.IllegalArgumentException: "requirement failed: Column features must be of type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 but was actually ArrayType(DoubleType,true)."

мой features колона съдържа масив от стойности с плаваща запетая. Това звучи като аз трябва да конвертирате тези към някакъв вид на вектор (това не е рядко, така че DenseVector?). Има ли начин да направите това директно на DataFrame или трябва да конвертирате в RDD?

Отговори:

13 за отговор № 1

Можете да използвате UDF:

udf(lambda vs: Vectors.dense(vs), VectorUDT())

В импортиране на Spark <2.0:

from pyspark.mllib.linalg import Vectors, VectorUDT

В импортиране на Spark 2.0+:

from pyspark.ml.linalg import Vectors, VectorUDT

Моля, имайте предвид, че тези класове не са съвместими въпреки идентичното изпълнение.

Възможно е също така да се извличат отделни елементи и да се сглобяват VectorAssembler, Ако се приеме, че се въвежда колона за въвеждане features:

from pyspark.ml.feature import VectorAssembler

n = ... # Size of features

assembler = VectorAssembler(
inputCols=["features[{0}]".format(i) for i in range(n)],
outputCol="features_vector")

assembler.transform(df.select(
"*", *(df["features"].getItem(i) for i in range(n))
))