【发布时间】:2016-02-11 17:47:02
【问题描述】:
Spark 的 StringIndexer 非常有用,但通常需要检索生成的索引值和原始字符串之间的对应关系,并且似乎应该有一种内置的方法来完成此操作。我将使用Spark documentation 中的这个简单示例进行说明:
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)
这个简化的案例告诉我们:
+---+--------+-------------+
| 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|
+---+--------+-------------+
一切都很好,但对于许多用例,我想知道我的原始字符串和索引标签之间的映射。我能想到的最简单的方法是这样的:
In [8]: indexed.select('category','categoryIndex').distinct().show()
+--------+-------------+
|category|categoryIndex|
+--------+-------------+
| b| 2.0|
| c| 1.0|
| a| 0.0|
+--------+-------------+
如果需要,我可以将其结果存储为字典或类似内容:
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'}
我的问题是:由于这是一项常见的任务,而且我猜测(但当然可能是错误的)字符串索引器无论如何都会以某种方式存储此映射,有没有办法更多地完成上述任务简单地?
我的解决方案或多或少是直截了当的,但对于大型数据结构,这涉及到(也许)我可以避免的大量额外计算。想法?
【问题讨论】:
标签: python apache-spark apache-spark-sql pyspark apache-spark-ml