Comment accéder à l'élément de vecteur Spark Sparse

Sep 11 2020

J'ai une colonne vectorielle clairsemée obtenue via OneHotEncoder dans une trame de données Spark, ressemblant essentiellement à ceci montrant les 10 premières lignes:

+------------------------------------+
|check_indexed_encoded               |
+------------------------------------+
|                       (3,[2],[1.0])|
|                       (3,[0],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[2],[1.0])|
|                       (3,[0],[1.0])|
+------------------------------------+
only showing top 10 rows

J'essaie d'accéder à ces éléments pour le reconvertir en mannequins (normalement) codés à chaud pour pouvoir convertir la trame entière sans problème en Pandas. Dans Spark, j'ai essayé d'utiliser .GetItem et .element, mais cela génère également un message d'erreur "Impossible d'extraire la valeur: besoin de type struct". Des idées pour en tirer les valeurs? Merci!

Réponses

1 Majte Sep 11 2020 at 17:56

Vous pouvez utiliser un UDF. Cela devrait le faire:

import pyspark.sql.functions as F
from pyspark.sql.types import DoubleType
from pyspark.sql.types import ArrayType

vector_udf = F.udf(lambda vector: vector.toArray().tolist(),ArrayType(DoubleType()))
df = df.withColumn("check_indexed_encoded_0", vector_udf(train["check_indexed_encoded"]).getItem(0))

Pour accéder aux 2ème éléments, utilisez getItem (1) etc.