1. 技术角度上,面向的数据集类型不同:ML的API是面向Dataset的(Dataframe是Dataset的子集,也就是Dataset[Row]), mllib是面对RDD的。Dataset和RDD有啥不同呢?Dataset的底端是RDD。Dataset对RDD进行了更深一层的优化,好比说有sql语言相似的黑魔法,Dataset支持静态类型分析因此在compile time就能报错,各类combinators(map,foreach等)性能会更好,等等。
2. 编程过程上,构建机器学习算法的过程不同:ML提倡使用pipelines,把数据想成水,水从管道的一段流入,从另外一端流出:
大致概念:DataFrame => Pipeline => A new DataFrame Pipeline: 是由若干个Transformers和Estimators连起来的数据处理过程 Transformer:入:DataFrame => 出: Data Frame Estimator:入:DataFrame => 出:Transformer
Mllib就是一些机器学习算法的合集,无组织无纪律,人心涣散,形态万千,常常不带做业,常年出去罚站。因此Mllib很杂很难写。 3. 对于开发者来言:若是你只是处理数据,构建机器学习算法来解决工程问题,就别想mllib和rdd了,出活最重要。若是你是Spark的开发者或者拓展者,那你必须配着茴香豆学习mllib和rdd的四种写法啊。不过撸出来必定要符合Spark 2.0的API规范哦。要否则没人用你的程序。 4. 如说上升到哲学玄学周易的角度上:我以为Scala一直缺一个对“集”这个概念的有效表达。虽然有一个scala.collection,但是如今的数据量,这货明显不够撸啊。Dataset目前是对“集”这个概念最合理抽象。就像给哑吧一张嘴,能够说出关于数据的不少故事。