train.csv数据:

id,name,age,sex
1,lyy,20,F
2,rdd,20,M
3,nyc,18,M
4,mzy,10,M

数据读取:

 SparkSession  spark = SparkSession.builder().enableHiveSupport()
.getOrCreate();
Dataset<Row> dataset = spark
.read()
.format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat")
.option("header", true)
.option("inferSchema", true)
.option("delimiter", ",")
//.load("file:///E:/git/bigdata_sparkIDE/spark-ide/workspace/test/SparkMLTest/SanFranciscoCrime/document/kaggle-旧金山犯罪分类/train-new.csv") //PreProcess1
.load("file:///E:/git/bigdata_sparkIDE/spark-ide/workspace/test/SparkMLTest/DataPreprocessing/document/train.csv") //PreProcess2
.persist();
     public static void PreProcess2(Dataset<Row> data) {

                 data.printSchema();
// 重新索引标签值
StringIndexerModel labelIndexer = new StringIndexer()
.setInputCol("sex")
.setOutputCol("label")
.fit(data); StringIndexerModel nameIndexer = new StringIndexer()
.setInputCol("name")
.setOutputCol("namenum")
.fit(data); /* 会报错:Exception in thread "main" java.lang.IllegalArgumentException: Field "namenum" does not exist.
* 原因是:Model类型调用fit时,要求数据集中必须包含InputCol所指定的列名
* 不会将Pipeline某个stage的输出作为InputCol,即使那个stage的OutputCol指定的列名与其相同也不行
* StringIndexerModel name1Indexer = new StringIndexer()
.setInputCol("namenum")
.setOutputCol("namenum1")
.fit(data);*/ /* 错误原因StringIndexerModel错误一样,features并不是data的列
* VectorIndexerModel featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexfeatures")
.setMaxCategories(4)
.fit(data);*/ //成功
//原因说明:非model时,转换器不会调用fit,而会使用Pipeline某个stage的输出作为InputCol
//由于stage[2]即 assembler已经生成features,故而该处直接使用;
//但是该类型时不能单独使用,必须依赖Pipeline
VectorIndexer featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexfeatures")
.setMaxCategories(); //由上述分析可知,该处输入的列可以是多个stage的输出组成,因为VectorAssembler非model
//因此可以使用中间生成结果,且可以使用多个
VectorAssembler assembler = new VectorAssembler()
.setInputCols("id,namenum,age".split(","))
.setOutputCol("features"); //这里的stage的顺序很重要,一定按照依赖关系顺序放入,如下顺序就会报错:
//Exception in thread "main" java.lang.IllegalArgumentException: Field "features" does not exist.
//Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer,nameIndexer,featureIndexer,assembler}); //将featureIndexer放到assembler即可
Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer,nameIndexer,assembler,featureIndexer}); // Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(data); // Make predictions.
Dataset<Row> result = model.transform(data); result.show(, false); }

root
|-- id: integer (nullable = true)
|-- name: string (nullable = true)
|-- age: integer (nullable = true)
|-- sex: string (nullable = true)

+---+----+---+---+-----+-------+--------------+-------------+
|id |name|age|sex|label|namenum|features |indexfeatures|
+---+----+---+---+-----+-------+--------------+-------------+
|1 |lyy |20 |F |1.0 |1.0 |[1.0,1.0,20.0]|[0.0,1.0,2.0]|
|2 |rdd |20 |M |0.0 |2.0 |[2.0,2.0,20.0]|[1.0,2.0,2.0]|
|3 |nyc |18 |M |0.0 |0.0 |[3.0,0.0,18.0]|[2.0,0.0,1.0]|
|4 |mzy |10 |M |0.0 |3.0 |[4.0,3.0,10.0]|[3.0,3.0,0.0]|
+---+----+---+---+-----+-------+--------------+-------------+

综上分析,可以将原有代码做一简化:

 public static void PreProcess2(Dataset<Row> data) {

                 data.printSchema();
// 重新索引标签值
StringIndexer labelIndexer = new StringIndexer()
.setInputCol("sex")
.setOutputCol("label"); StringIndexer nameIndexer = new StringIndexer()
.setInputCol("name")
.setOutputCol("namenum"); VectorIndexer featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexfeatures")
.setMaxCategories(); VectorAssembler assembler = new VectorAssembler()
.setInputCols("id,namenum,age".split(","))
.setOutputCol("features"); Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer,nameIndexer,assembler,featureIndexer}); // Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(data); //以这里的data为基准数据 // Make predictions.
Dataset<Row> result = model.transform(data); result.show(, false); }

运行结果:

root
|-- id: integer (nullable = true)
|-- name: string (nullable = true)
|-- age: integer (nullable = true)
|-- sex: string (nullable = true) +---+----+---+---+-----+-------+--------------+-------------+
|id |name|age|sex|label|namenum|features |indexfeatures|
+---+----+---+---+-----+-------+--------------+-------------+
| |lyy | |F |1.0 |1.0 |[1.0,1.0,20.0]|[0.0,1.0,2.0]|
| |rdd | |M |0.0 |2.0 |[2.0,2.0,20.0]|[1.0,2.0,2.0]|
| |nyc | |M |0.0 |0.0 |[3.0,0.0,18.0]|[2.0,0.0,1.0]|
| |mzy | |M |0.0 |3.0 |[4.0,3.0,10.0]|[3.0,3.0,0.0]|
+---+----+---+---+-----+-------+--------------+-------------+

在使用Pipeline串联多个stage时model和非model的区别的更多相关文章

  1. 遍历字典时用与不用iter的区别

    遍历字典时用与不用iter的区别 遍历字典的时候一般会用这三个方法:keys(),values(),items() 同时,它们各自都有升级版的方法:iterkeys(),itervalues(),it ...

  2. Java运行时异常和非运行时异常

    1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...

  3. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  4. Java常见的异常,Java运行时异常和一般异常的区别

    Java常见的异常,Java运行时异常和一般异常的区别 异常和错误二者的不同之处: Exception: 1.可以是可被控制(checked,检查异常) 或不可控制的(unchecked,非检查异常) ...

  5. Java检查异常、非检查异常、运行时异常、非运行时异常的区别

    Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类. Java的异常(Exception和Error)分为检查异常和非检查的异常. 其 ...

  6. Java检查异常和非检查异常,运行时异常和非运行时异常的区别

    通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions).其中根据Exception异常 ...

  7. Java运行时异常与非运行时异常

    Java运行时异常与非运行时异常 Exception(异常)是程序本身可以处理的异常.主要包含RuntimeException等运行时异常和IOException,SQLException等非运行时异 ...

  8. js调用函数时括号加与不加的区别,function()&function

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  9. 解决获取IP地址时出现“在一个非套…

    今天单位的一台机器在用IPCONFIG/RENEW时遇到了这个问题,上网查了一下,网上的版本在对XP不太好用,网上的版本如下: 1.从注册表中备份以下项:(当然也可以用Erunt备份整个注册表)HKE ...

随机推荐

  1. Unity透明视频播放 所需的Shader脚本

    Shader "Custom/ShaderMovie" { Properties { _MainTex("Color (RGB)", 2D) = "b ...

  2. MySql服务未知原因消失了的解决办法

    一: 5.1及后续版本: 打开计算机命令窗口,切换至mysql安装目录,然后运行bin目录下的mysqld.exe,命令如下: D:\MySQL\bin>mysqld.exe -installS ...

  3. HDU 5536--Chip Factory(暴力)

    Chip Factory Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

  4. 【2018 ICPC亚洲区域赛徐州站 A】Rikka with Minimum Spanning Trees(求最小生成树个数与总权值的乘积)

    Hello everyone! I am your old friend Rikka. Welcome to Xuzhou. This is the first problem, which is a ...

  5. uva_11806_Cheerleaders

    In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...

  6. Zabbix——设置模板

    前提条件: Zabbix版本为4.0 可以正常使用Server 1. 添加H3C网络交换机的CPU和内存模板,并配置自动发现. 注意,需要添加完成后,重新进行搜索后再此进入才有下列选项. 添加CPU的 ...

  7. PHP程序员面试中经常被提问的问题【转载】

    1. Include 与 require的区别,require和require_once的效率哪个高? Php在遇到include时就解释一次,如果页面中出现10次include,php就解释10次, ...

  8. DOM节点操作阶段性总结

    HTML中能看到的所有东西都是dom树中的一个节点,注意是“所有”,使用childNodes()可以看到,回车(换行)也是一个节点. 从上图可以看到,select中有四个option,但是有9个节点. ...

  9. Java并发编程:浅析几种线程安全模型 [转]

    多线程编程一直是老生常谈的问题,在Java中,随着JDK的逐渐发展,JDK提供给我们的并发模型也越来越多,本文摘取三例使用不同原理的模型,分析其大致原理.目录如下: 1.COW之CopyOnWrite ...

  10. DataSet和泛型之间相互转换

    取数据的时候,存储过程返回了多个结果集,后台用DataSet去接收这几个结果集,然后接收之后,需要将结果集转换为不同的实体,于是下面的代码便出现了. /// <summary> /// 将 ...