StringIndexer对String按频次进行编号
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 |
如果转换模型(关系)是基于上面数据得到的 (a,b,c)->(0.0,2.0,1.0),如果用此模型转换category多于(a,b,c)的数据,比如多了d,e,就会遇到麻烦:
id | category | categoryIndex |
---|---|---|
0 | a | 0.0 |
1 | b | 2.0 |
2 | d | ? |
3 | e | ? |
4 | a | 0.0 |
5 | c | 1.0 |
Spark提供了两种处理方式:
StringIndexerModel labelIndexerModel=new StringIndexer().
setInputCol("label")
.setOutputCol("indexedLabel")
//.setHandleInvalid("error")
.setHandleInvalid("skip")
.fit(rawData);
(1)默认设置,也就是.setHandleInvalid(“error”):会抛出异常
org.apache.spark.SparkException: Unseen label: d,e
(2).setHandleInvalid(“skip”) 忽略这些label所在行的数据,正常运行,将输出如下结果:
id | category | categoryIndex |
---|---|---|
0 | a | 0.0 |
1 | b | 2.0 |
4 | a | 0.0 |
5 | c | 1.0 |