Spark's StringIndexer è piuttosto utile, ma è normale che sia necessario recuperare le corrispondenze tra i valori dell'indice generato e le stringhe originali e sembra che ci debba essere un modo incorporato per eseguire Questo. Illustrerò utilizzare questo semplice esempio dal Spark documentation:Conserva l'indicizzatore di stringhe di indici stringa di corrispondenza
from pyspark.ml.feature import StringIndexer
df = sqlContext.createDataFrame(
[(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c")],
["id", "category"])
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
indexed_df = indexer.fit(df).transform(df)
Questo caso semplificata ci dà:
+---+--------+-------------+
| id|category|categoryIndex|
+---+--------+-------------+
| 0| a| 0.0|
| 1| b| 2.0|
| 2| c| 1.0|
| 3| a| 0.0|
| 4| a| 0.0|
| 5| c| 1.0|
+---+--------+-------------+
tutto bene e dandy, ma per molti casi di utilizzo voglio sapere la mappatura tra il mio stringhe originali e le etichette indice. Il modo più semplice che posso pensare di farlo fuori mano è qualcosa di simile:
In [8]: indexed.select('category','categoryIndex').distinct().show()
+--------+-------------+
|category|categoryIndex|
+--------+-------------+
| b| 2.0|
| c| 1.0|
| a| 0.0|
+--------+-------------+
Il risultato di cui ho potuto conservare come un dizionario o simili se volevo:
In [12]: mapping = {row.categoryIndex:row.category for row in
indexed.select('category','categoryIndex').distinct().collect()}
In [13]: mapping
Out[13]: {0.0: u'a', 1.0: u'c', 2.0: u'b'}
La mia domanda è questa : Dato che questo è un compito molto comune, e sto indovinando (ma ovviamente potrei sbagliarmi) che l'indicizzatore di stringhe è in qualche modo in grado di memorizzare questa mappatura in ogni caso, c'è un modo per svolgere il compito sopra più semplicemente?
La mia soluzione è più o meno semplice, ma per le strutture di dati di grandi dimensioni questo comporta un sacco di calcoli extra che (forse) posso evitare. Idee?