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. 使用Analyze 和Instruments-Leaks分析解决iOS内存泄露

    版权声明:本文为博主原创文章,未经博主允许不得转载. 使用Analyze和Instruments-Leaks分析解决iOS内存泄露   实验的开发环境:Xcode 7   一.使用Product-An ...

  2. 【Linux资源管理】一款优秀的linux监控工具——nmon

    (一)nmon工具概述 nmon是以一个用来做linux服务器监控的工具,通过nmon,可以实现对以下参数的监控: --CPU使用率 --内存.交换空间使用率 --网络使用情况 --磁盘I/O,读写速 ...

  3. Oracle中按规定的字符截取字符串

    CREATE OR REPLACE FUNCTION "F_SPLIT" (p_str IN CLOB, p_delimiter IN VARCHAR2) RETURN ty_st ...

  4. 大专生自学iOS到找到工作的前前后后

    先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...

  5. LAMP+Varnish的实现

    基于Keepalived+Varnish+Nginx实现的高可用LAMP架构 注意:各节点的时间需要同步(ntpdate ntp1.aliyun.com),关闭firewalld(systemctl ...

  6. Linq 综合写法

    var queryCount = (from pv in db.Province join pc in (from cc in         ((from v in db.ERPStockProdu ...

  7. 集合,ArrayList练习

    import java.util.ArrayList; import java.util.Iterator; public class ArrayListTest { public static vo ...

  8. Win7配置express4环境

    本机环境: $ node -v v10.14.1 $ npm -v 6.4.1 配置node环境变量: #配置全局安装目录 npm config set prefix "G:\WEB\nod ...

  9. 大专生自学web前端到找到工作的前前后后

    先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...

  10. shell中的死记硬背

    一.shell的引号们 1."" -> 双引号(不保留完整内容,比如遇到$, 反引号, \ 等就会执行相应的shell) echo "Today is `date` ...