Cómo acceder al elemento de vector disperso de chispa

Sep 11 2020

Tengo una columna de vector dispersa obtenida a través de OneHotEncoder en un marco de datos de chispa, básicamente se ve así mostrando las primeras 10 filas:

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

Estoy tratando de acceder a estos elementos para convertirlos básicamente de nuevo en maniquíes (normalmente) codificados en caliente para poder convertir todo el marco sin problemas en Pandas. Dentro de Spark intenté usar .GetItem y .element, pero esto también arroja un mensaje de error "No se puede extraer el valor: se necesita el tipo de estructura". ¿Alguna idea de cómo obtener los valores de eso? ¡Gracias!

Respuestas

1 Majte Sep 11 2020 at 17:56

Podrías usar una UDF. Esto debería hacerlo:

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

Para acceder a los segundos elementos, use getItem (1), etc.