在Spark MLlib Guide之后我们可以读到Spark有两个机器学习库:
spark.mllib
,建立在RDD之上。spark.ml
,构建于Dataframes之上。根据StackOverflow上的this和this问题,Dataframe比RDD更好(和更新),应尽可能使用。
问题是我想使用常见的机器学习算法(例如:Frequent Pattern Mining,Naive Bayes等)和spark.ml
(对于数据帧)不提供此类方法,只有spark.mllib
(对于RDD)提供此算法。
如果Dataframes比RDD更好并且推荐指南建议使用spark.ml
,为什么不能在该lib中实现常见的机器学习方法?
答案 0 :(得分:14)
Spark 2.0.0
目前,Spark正在向DataFrame
API强烈推动RDD API的持续弃用。虽然有多少本土" ML"算法正在增长下面强调的要点仍然有效,内部许多阶段直接使用RDD实现。
另请参阅:Switch RDD-based MLlib APIs to maintenance mode in Spark 2.0
Spark< 2.0.0 强>
我想主要的缺点是spark.ml
算法通常不会对DataFrame进行操作。所以在实践中,更多的是拥有ml
包装器而不是其他任何东西。甚至本机ML实现(如ml.recommendation.ALS
内部使用RDDs
。)
为什么不在DataFrames之上从头开始实现所有内容?最有可能的原因是,只有非常小的机器学习算法子集实际上可以从当前在Catalyst中实现的优化中受益,更不用说使用DataFrame API / SQL有效且自然地实现了。
DataFrame
/ Dataset
VectorUDT
等UDT扩展。 DataFrames还有一个问题,它与机器学习无关。当您决定在代码中使用DataFrame时,您几乎可以获得静态类型和类型推断的所有好处。如果你认为它是一个问题或者没有问题,这是非常主观的,但有一点肯定,它在Scala世界中并不自然。
关于更好,更新,更快,我会看看Deep Dive into Spark SQL’s Catalyst Optimizer,特别是与quasiquotes相关的部分:
下图显示quasiquotes让我们生成的代码具有与手动调优程序类似的性能。
*这已在Spark 1.6中更改,但仍限于默认HashPartitioning