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目前是對「集」這個概念最合理抽象。就像給啞吧一張嘴,能夠說出關於數據的不少故事。