尽管Spark ML管道提供了各种各样的算法,你仍可能想要额外的功能,并且不脱离管道模型。在Spark Mllib中,这算不上什么问题,你可以通过RDD的变换来实现你自己的算法,并继续下去。对于Spark ML 管道来说,同样的方法是可行的,但是我们会失去一些管道所具备的优良特性,包括自动执行元算法的能力,例如交叉验证的参数搜索。在本文中,你会从标准的wordcount例子入手(在大数据方面,你是不可能真正躲开wordcount例子的),了解到如何扩展Spark ML 管道模型。
为了将你自己的算法加入Spark管道中来,你需要实现Estimator或者是Transformer,它们都实现了PipelineStage接口。对于那些不需要训练的算法,你可以实现Transformer接口,而对于那些需要训练的算法,你需要实现Estimator接口,它们都定义在org.apache.spark.ml下(都实现了基类 PipelineStage)。要说明的是,训练并不是只限于复杂的机器学习模型,即使是最大最小值区间缩放器也需要训练来确定范围。如果你的算法需要训练,它们必须以Estimator来构建而不是Transformer。
注:直接使用PipelineStage是不可行的,因为管道内部使用了反射机制,假定了所有的管道stage要么是一个Estimator,要么就是Transformer。
除了显而易见的transform和fit方法,所有的管道的stage需要提供transformSchema,以及一个copy构造器或者实现一个可以为你提供这些功能的类。copy是用来制作一个当前stage的拷贝,合并入任何新指定的参数,可以简称为defaultCopy(除非你的类对构造器有特别的考虑)。