7

Dostaję następujący błąd próbując zbudować ML Pipeline:Jak przekonwertować ArrayType na DenseVector w PySpark DataFrame?

pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Column features must be of type [email protected] but was actually ArrayType(DoubleType,true).' 

Moja features kolumna zawiera tablicę zmiennoprzecinkowych. Wygląda na to, że muszę je przekonwertować do jakiegoś wektora (nie jest rzadki, więc DenseVector?). Czy istnieje sposób, aby to zrobić bezpośrednio w DataFrame lub czy muszę przekonwertować na RDD?

Odpowiedz

12

Można użyć UDF:

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

W Spark < 2,0 import:

from pyspark.mllib.linalg import Vectors, VectorUDT 

W Spark 2.0+ import:

from pyspark.ml.linalg import Vectors, VectorUDT 

Należy pamiętać, że te zajęcia nie są kompatybilne pomimo identycznej implementacji.

Istnieje również możliwość wyodrębnienia poszczególnych funkcji i złożenia przy pomocy VectorAssembler. Zakładając, że kolumna wejściowa nazywa się 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)) 
)) 
Powiązane problemy