我的PipelinedRDD
中有一列名义值,我想将其转换为索引编码以进行分类。
我过去常常使用StringIndexer
pyspark.ml
,这非常容易使用。但是,这次我正在学习如何处理rdd而不是数据帧,并且pyspark.mllib
中没有这样的事情。
感谢任何帮助。
答案 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]))