首页 > spark ml中一个比较通用的transformer

spark ml中一个比较通用的transformer

  spark ml中有许多好用的transformer,很方便用来做特征的处理,比如Tokenizer, StopWordsRemover等,具体可参看文档:http://spark.apache.org/docs/2.1.0/ml-features.html . 但是呢,这些都是一些特定的操作,组内的同事提了一个需求,能不能写一个通用的模板,用来做特征转化,让代码看起来比较整洁规整。后来经过参考spark中那些transformer的写法, 弄了一个比较通用的模板,只能说比较通用,还是有些需求不能满足的。模板其实很简单,几行代码就搞定了,如下:

  

import org.apache.spark.ml.UnaryTransformer
import org.apache.spark.ml.util.{DefaultParamsWritable, Identifiable}
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.sql.types._// 对泛型参数进行说明: I表示 InputCol的类型, O 表示OutputCol的类型
class KgTransformer[I, O](override val uid: String) extends UnaryTransformer[I, O, KgTransformer[I, O]] with DefaultParamsWritable {var kgOutputDataType: DataType = _var f: I => O = _// 第一个参数表示OutputCol的类型, 这里需要使用spark ml中类型,其它更多的使用方式可以参考官方文档或者其它源码中写的相似代码// 第二个参数表示 作用在 InputCol上的操作函数def this(kgOutputDataType: DataType, f: I => O) = {this(Identifiable.randomUID("kgTransformer"))this.kgOutputDataType = kgOutputDataTypethis.f = f}override def outputDataType: DataType = kgOutputDataType//自定义实现验证, 这里默认没验证override def validateInputType(inputType: DataType): Unit = {}// 这里是申明一个名为createTransformFunc的函数, 返回值是一个函数:返回一个参数类型为I, 返回值类型为 O 的函数override def createTransformFunc: (I) => O = {//其实这玩意就是想搞一个map的函数体来(in: I) => f(in) //返回一个函数
    }
}

以上这个工具类模型就写好了,以后对于一些操作都可以用这种通用的写法,如下:

// 使用方式举例:
object TestKgTransformer {def main(args: Array[String]) {val spark = SparkSession.builder().appName("TestKgTransformer").master("local").getOrCreate()spark.sparkContext.setLogLevel("ERROR")import spark.implicits._val data: DataFrame = spark.createDataFrame(Seq((0.0, "a;c;e"),(1.0, "b;f;g"),(2.0, "c;c"),(3.0, "c;k;f;e;c"))).toDF("id", "words")data.show(false)// 输入列为id, 输出列为kgIdOut, 操作为给 id列的值加上5val kgTrans1 = new KgTransformer[Double, Double](DataTypes.DoubleType, _ + 5).setInputCol("id").setOutputCol("kgIdOut")val res1 = kgTrans1.transform(data)res1.show(false)// 输入列为words, 输出列为 kgWordsOut ,操作为对 words 进行切割val kgTrans2 = new KgTransformer[String, Array[String]](new ArrayType(StringType, true), _.split("\;")).setInputCol("words").setOutputCol("kgWordsOut")kgTrans2.transform(res1).show(false)spark.stop()}
}

就只有这么多啦,代码量很少,不过挺实用的,上面的代码是可以直接运行的。

结果如下:

+---+---------+

|id |words |

+---+---------+

|0.0|a;c;e |

|1.0|b;f;g |

|2.0|c;c |

|3.0|c;k;f;e;c|

+---+---------+

+---+---------+-------+

|id |words |kgIdOut|

+---+---------+-------+

|0.0|a;c;e |5.0 |

|1.0|b;f;g |6.0 |

|2.0|c;c |7.0 |

|3.0|c;k;f;e;c|8.0 |

+---+---------+-------+

+---+---------+-------+---------------+

|id |words |kgIdOut|kgWordsOut |

+---+---------+-------+---------------+

|0.0|a;c;e |5.0 |[a, c, e] |

|1.0|b;f;g |6.0 |[b, f, g] |

|2.0|c;c |7.0 |[c, c] |

|3.0|c;k;f;e;c|8.0 |[c, k, f, e, c]|

+---+---------+-------+---------------+

 

 

转载于:https://www.cnblogs.com/wuxilc/p/9290951.html

更多相关:

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...

  •     先吐为敬!   最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆“代码拷贝党”、“留一手”、“缺斤少两”、“不说人话”、“自己都没跑通还出来发blog”、“各种缺少依赖包”、“各种注释都没有”、“自己都不知道在写什么”的程序大神纷纷为了增加自己博客一个帖子的名额而发布了各种千奇百�...

  • 阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称 C++获取线程id是通过系统调用来直接获取 函数描述 头文件: 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字,即为当前线程id 此外函数pthread_s...

  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实际生产环境中必须考虑的问题。 面试题剖析 基于数据库的实现方案 数据库自增 id 这个就是说你的...

  • ORM操作    单表、一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(m...

  • 建立如下表: 建表语句: class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句 c...