Spark MLlib中的StringIndexer

时间:2018-02-14 03:49:33

标签: python apache-spark pyspark rdd apache-spark-mllib

我的PipelinedRDD中有一列名义值,我想将其转换为索引编码以进行分类。

我过去常常使用StringIndexer pyspark.ml,这非常容易使用。但是,这次我正在学习如何处理rdd而不是数据帧,并且pyspark.mllib中没有这样的事情。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

Spark MLlib中没有StringIndexer,因此您需要自己完成工作。首先收集该列的所有可能值并为每个值分配一个数字,将其另存为字典。然后,将其应用于原始的rdd值。

下面的代码假设PipelinedRDD包含每行的两个值,并在第一个位置(0)转换值:

dic = PipelinedRDD.map(lambda x: x[0]).distinct().zipWithIndex().collectAsMap()
PipelinedRDD = PipelinedRDD.map(lambda x: (dic[x[0]], x[1]))

注意:这与StringIndexer的Spark实现略有不同,因为它没有考虑值的频率(Spark会将0分配给最显示的值,然后1等等)。但是,在大多数情况下,分配不同字符串的索引无关紧要。

<强>扩展 如果你想模仿StringIndexer的作用,正如上面的注释中所提到的那样,代码可以稍加修改以考虑到这一点

dic = PiplelinedRDD.groupBy('cat_column').count().sort(col("count").desc()).map(lambda x: x[0]).zipWithIndex().collectAsMap()
PipelinedRDD = PipelinedRDD.map(lambda x: (dic[x[0]], x[1]))