初窥门径
Spark的MLlib组件内置实现了很多常见的机器学习算法,包括数据抽取,分类,聚类,关联分析,协同过滤等等.
然鹅,内置的算法并不能满足我们所有的需求,所以我们还是经常需要自定义ML算法.
MLlib提供的API分为两类:
- 1.基于DataFrame的API,属于spark.ml包.
- 2.基于RDD的API, 属于spark.mllib包.
从Spark 2.0开始,Spark的API全面从RDD转向DataFrame,MLlib也是如此,官网原话如下:
Announcement: DataFrame-based API is primary API
The MLlib RDD-based API is now in maintenance mode.
所以本文将介绍基于DataFrame的自定义ml类编写方法.不涉及具体算法,只讲扩展ml类的方法.
略知一二
官方文档并没有介绍如何自定义ml类,所以只有从源码入手,看看源码里面是怎么实现的.
找一个最简单的内置算法入手,这个算法就是内置的分词器,Tokenizer.
Tokenizer只是简单的将文本以空白部分进行分割,只适合给英文进行分词,所以它的实现及其简短,源码如下:
package org.apache.spark.ml.feature
import org.apache.spark.annotation.Since
import org.apache.spark.ml.UnaryTransformer
import org.apache.spark.ml.param._
import org.apache.spark.ml.util._
import org.apache.spark.sql.types.{ArrayType, DataType, StringType}
/**
* A tokenizer that converts the input string to lowercase and then splits it by white spaces.
*
* @see [[RegexTokenizer]]
*/
@Since("1.2.0")
class Tokenizer @Since("1.4.0") (@Since("1.4.0") override val uid: String)
extends UnaryTransformer[String, Seq[String], Tokenizer] with DefaultParamsWritable {