Come accedere all'elemento vettoriale spark sparse

Sep 11 2020

Ho una colonna vettoriale sparsa ottenuta tramite OneHotEncoder in un dataframe spark, sostanzialmente simile a questa che mostra le prime 10 righe:

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

Sto cercando di accedere a questi elementi per riconvertirlo in pratica (normalmente) manichini codificati a caldo per poter convertire l'intero fotogramma senza problemi in Panda. All'interno di Spark ho provato a utilizzare .GetItem e .element ma questo genera anche un messaggio di errore "Impossibile estrarre il valore: è necessario il tipo di struttura". Qualche idea su come ottenere i valori da quello? Grazie!

Risposte

1 Majte Sep 11 2020 at 17:56

Potresti usare un UDF. Questo dovrebbe farlo:

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

Per accedere al secondo elemento usa getItem (1) ecc.