我注意到SparkML中有两个LinearRegressionModel
类,一个在ML包(spark.ml
)中,另一个在MLLib(spark.mllib
)包中。
这两个类的实现方式有很大的不同,例如来自MLLib
的类实现了Serializable
接口,而另一个则没有。
顺便说一下,对于RandomForestModel
或Word2Vec
也是如此。
为什么会有两个类?哪一个是“正确”的?是否有办法将一个转换为另一个?
我注意到SparkML中有两个LinearRegressionModel
类,一个在ML包(spark.ml
)中,另一个在MLLib(spark.mllib
)包中。
这两个类的实现方式有很大的不同,例如来自MLLib
的类实现了Serializable
接口,而另一个则没有。
顺便说一下,对于RandomForestModel
或Word2Vec
也是如此。
为什么会有两个类?哪一个是“正确”的?是否有办法将一个转换为另一个?
o.a.s.mllib
包含旧的基于RDD的API,而o.a.s.ml
则包含围绕Dataset
和ML Pipelines构建的新API。在2.0.0中,ml
和mllib
达到了功能平衡,并且mllib
正在逐渐被弃用(这已经在线性回归的情况下发生),很可能会在下一个主要版本中被删除。
因此,除非您的目标是向后兼容,否则“正确的选择”是o.a.s.ml
。
Spark Mllib
Spark Mllib包含建立在RDD之上的旧版API。
Spark ML
Spark ML提供了更高级别的API,建立在DataFrames之上,用于构建ML管道。
根据官方公告
从Spark 2.0开始,spark.mllib包中基于RDD的API已进入维护模式。 Spark的主要机器学习API现在是基于DataFrames的API,位于spark.ml包中。 建议使用Apache Spark的spark.ml。
MLlib将仍然支持基于RDD的API(在spark.mllib中)进行错误修复。
MLlib将不会向基于RDD的API添加新功能。
在Spark 2.x版本中,MLlib将通过基于DataFrames的API添加功能,以达到与基于RDD的API的功能平衡。
在达到功能平衡之后(大约估计为Spark 2.3),基于RDD的API将被弃用。
预计在Spark 3.0中删除基于RDD的API。
为什么MLlib要切换到基于DataFrames的API?
DataFrames提供比RDD更加用户友好的API。DataFrames的许多优点包括Spark数据源、SQL/DataFrame查询、Tungsten和Catalyst优化以及跨语言的统一API。
基于DataFrame的MLlib API为机器学习算法提供了跨算法、跨多种语言的统一API。
DataFrames有助于实用的ML Pipeline,特别是特征转换。有关详细信息,请参见Pipelines指南。
更多信息请参见:机器学习库(MLlib)指南