当前位置: 首页 > 编程日记 > 正文

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

相关文章:

mysql 常用函数循环_近30个MySQL常用函数,看到就是学到,纯干货收藏!

概念:相当于java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名隐藏了实现细节提高代码的可重用性使用:select 函数名(实参列表)【from 表】 【】中内容可省略正文:字符函数:length:…

连接Oracle错误:800a0e7a未找到提供程序的解决

一、现象: C#程序中需要以ProviderOraOLEDB.Oracle.1方式访问ORACLE数据库。但程序执行时报异常:未在本地计算机注册“OraOLEDB.Oracle.1”提供程序 二、解决方案: 1、在Oracle安装目录找到Oracle的主程序目录,点击鼠标右键->属…

定义一个属性_Python property属性

1. 什么是property属性一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法# ############### 定义 ###############class Foo: def func(self): pass # 定义property属性 property def prop(self): pass# ############### 调用 ###############foo_obj…

MySQL 字段类型知识

tinyint(m)  值的范围:-128 ~ 127;unsigned 时,0 ~ 255。存储占用1字节 m 默认为4,和存储空间、数字位数没有关系,表示左侧补空格(默认,声明 zerofill 则补0,如0001)到…

mysql 单实例部署_Mysql 数据库单机多实例部署手记

最近的研发机器需要部署多个环境,包括数据库。为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式。找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运行,再进行一系列的配置调…

用python做一个图片验证码

看一下做出来的验证码长啥样 验证码分析 1. 有很多点 2. 有很多线条 3. 有字母,有数字 需要用到的模块: 1. random 2. Pillow (python3中使用pillow) 安装pillow : pip install pillow pillow的用法: 创建一张图片: from PIL im…

地图测量面积工具app_全站仪的使用面积测量

测量与地图制作见习全站仪使用11 / 20#2020 #全站仪是全站型电子速测仪的简称,是电子经纬仪、光学测距仪及微处理器相结合的光电仪器。其可直接测量距离、角度、坐标,根据三角函数原理,已知两点坐标信息推算出无数个第三点的坐标信息。下面让…

Palette使用

1.定义: Palette:可以在一张图片里面分析出一些色彩特性:主色调、鲜艳的颜色、柔和颜色等等…… 2.使用: 1). 2).效果图 3.获取颜色样品: 1). 2).颜色组装算法: 3).效果图:转载于:https://www.cnblogs.com/jeffery336699/p/9294681.html

PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者...

def a2(arg):if len(arg) > 2:del arg[2:]li [12,13,14,15] a2(li) print(li) 转载于:https://www.cnblogs.com/zgyc/p/6229722.html

文件流能转换格式吗_amr转换mp3格式文件

MP3是非常标准的音频数字编码格式。区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小。因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3。今天要给大家说的是如何把amr格式的音频文件转换成mp3格式…

1196: 数星星(二)(结构体专题)_福利:最新导数6大专题!高分段提分有困扰?听北大状元漫谈提分...

这是一篇适合数学120分以上的高中生深度研读的随感。文末有福利!振宇老师从教的十几年中,遇到高分段学生最大的困扰便是:130分以上每提一分便需要付出极大的努力。究其原因,便是思维不够严谨全面,无法拿全分&#xff0…

RTMP协议中的Chunk Stream ID (CID)的作用

一、协议分层 RTMP包是以Message的结构封装的,结构如下所示: 1)Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。 Message Type ID为8&#x…

fceux源码解析_fceux源码解析_从源代码制作deb包的两种方法以及修改已有deb包(转载)...

1. 原理1) deb包通常包含两部分:控制信息(DEBIAN目录)、安装内容(模拟"/"目录)2) 通过解开已有的deb包看其中内容i. 释放安装内容到dirname目录中$ dpkg-X xxx.deb dirnameii. 释放控制信息到当前目录下的DEBIAN子目录中$ dpkg-e xxx.deb2. 准备1) 安装相…

Centos 7 意外断电如何处理

拔U盘的时候,不小心碰到了主机上的开机键…… 还好默认的响应动作是睡眠…… 还不知道 CentOS 怎么样应对意外断电呢?! 转载于:https://www.cnblogs.com/liaozt/p/6232189.html

静茹docker容器的几种方法_Docker介绍及使用

什么是容器?容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等,kvm虚拟机,linux,系统文件程序:代码&#…

Elasticsearch 6.3.1、Head插件 安装及配置

安装Elasticsearch Elasticsearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch 也可以直接使用wget下载到某目录下, 本文所有下载的包都放在 /home/tools 中, 解压后移到 /home/apps目录下  wget https://artifacts.elastic.co/downloa…

Android中的eventBus传值

第一步:在build.gradle中添加依赖dependencies { compile org.greenrobot:eventbus:3.0.0} 第二步:创建一个 Event类: 注意:enum 不是classpublic enum Event {//消息名,可以根据这个名字判断是哪个消息 IMAGE_LOA…

mysql 优化器算法_SQL 查询优化器底层原理解析【MySQL 篇】

前言SQL 执行流程中有一个模块叫做查询优化器,这个模块的功能主要是对 SQL 语法树进行逻辑优化和物理优化,最终生成执行计划交给执行引擎执行 SQL。查询优化器主要分为两部分:一部分是逻辑优化,一部分是物理优化。逻辑优化会将 SQ…

gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...

点击上方蓝字关注我吧!本篇文章大概3300字,阅读时间大约10分钟前面文章,透彻分析了Netty的接收缓冲区优化的套路和实现细节,以及写数据和刷新数据的宏观流程和细节:从源码出发:在宏观上把握Netty写数据到应…

原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间…

python读取数据校验数据_Python通过Schema实现数据验证方式

Schema是什么?不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据。意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证。…

String,StringBuffer

String类代表不可变的字符序列。 String s1 "hello"; String s2 "hello"; s1 s2 > true "hello"是字符串常量,存在data seg中,编译器对data seg有优化,对于已经有的数据,不是重新分配空间&a…

蒙特卡洛粒子滤波定位算法_粒子滤波——来自哈佛的详细的粒子滤波器教程【1】...

本文原版链接:https://www.seas.harvard.edu/courses/cs281/papers/doucet-johansen.pdf本文是哈佛大学相关研究人员于2008年发表的一篇关于粒子滤波的详细教程,至今已被引用1687次。目录:介绍Introduction1.1 序言Preliminary remarks1.2 教…

人脸识别的一些资源

人脸识别的全部源代码(在Visual C6.0下可以运行识别)http://www.61ic.com/Download/DaVinci/Code/201304/121592.html 智能分析接口(支持车牌识别,人脸识别等智能类型)提供DEMO和源码,供参考!http://www.61ic.com/Down…

mysql where关键字_MySQL WHERE 子句

我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。语法以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:SELECT field1, field2,...fieldN FROM table_name…

mac远程连接windows工具_Windows远程MAC系统

第一步、在 Mac 上设置好屏幕共享1. 1先请在苹果 Mac 电脑上的“系统偏好设置”窗口中打开“共享”功能,如图所示接着在共享窗口中的左侧点击启用“屏幕共享”选项,如图所示当屏幕共享功能打开以后,请点击“电脑设置”按钮,如图所…

Tomcat虚拟目录设置

ssh $host "rm -fr /var/www/$tomcat_name/webapps/*" 远程分发war包部署tomcat项目时&#xff0c;需要先清除项目目录。 --------------------------------------------------------------------------------------- <context path"" docBase"&qu…

30005 rust_Steam三连冠老游戏《腐蚀(RUST)》为什么突然火起来了?

Steam新一周(1月18日-1月24日)销量榜公开&#xff0c;《赛博朋克2077》跌落至第五&#xff0c;《荒野大镖客2》前进到第六&#xff0c;而第一人称僵尸生存网络游戏《Rust》已经三连冠了&#xff0c;腐蚀是2013年的老游戏了&#xff0c;很多人问这个游戏值不值得购买&#xff0c…

(6)解构赋值的用途

解构赋值的用途1.交换变量的值 var a 100; var b 200; var t; t a; a b; b t; //解构赋值的写法完成【ES6交换变量的值】 var x 100; var y 200; [x, y] [y, x]; console.log(x); console.log(y); 优点1:直观 优点2:一一对应 优点3:节省内存空间(不用多申请变量) 2.从函…

python lstm_python-Keras中LSTM的补充

好的,所以您的问题让我开始思考,我想我已经解决了,但是什么都没有.这是我为获取LSTM实现背后的一些见识而编写的代码段.from keras.layers import LSTMfrom keras.models import Sequentialmodel Sequential()model.add(LSTM(10, input_shape(20, 30), return_sequencesTrue))…