我只是想知道Apache Spark中的RDD和DataFrame (Spark 2.0.0 DataFrame只是一个类型别名Dataset[Row])有什么区别?
你能把一个转换成另一个吗?
以下示例代码尝试将一些案例对象放入数据框中.代码包括案例对象层次结构的定义和使用此特征的案例类:
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.SQLContext
sealed trait Some
case object AType extends Some
case object BType extends Some
case class Data( name : String, t: Some)
object Example {
def main(args: Array[String]) : Unit = {
val conf = new SparkConf()
.setAppName( "Example" )
.setMaster( "local[*]")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val df = sc.parallelize( Seq( Data( "a", AType), Data( "b", BType) ), 4).toDF()
df.show()
}
}
Run Code Online (Sandbox Code Playgroud)
执行代码时,我遗憾地遇到以下异常:
java.lang.UnsupportedOperationException: Schema for type …Run Code Online (Sandbox Code Playgroud) 遵循Spark MLlib指南, 我们可以读到Spark有两个机器学习库:
spark.mllib,建立在RDD之上.spark.ml,建立在Dataframes之上.根据 StackOverflow上的这个和这个问题,Dataframes比RDD更好(和更新),应尽可能使用.
问题是我想使用常见的机器学习算法(例如:Frequent Pattern Mining,Naive Bayes等)和spark.ml(对于数据帧)不提供此类方法,仅spark.mllib(对于RDD)提供此算法.
如果Dataframes比RDD更好并且推荐指南推荐使用spark.ml,为什么不能在该lib中实现常见的机器学习方法?
machine-learning apache-spark pyspark apache-spark-ml apache-spark-mllib
据我所知,distinct()散列分区RDD以识别唯一键.但它是否优化了每个分区只移动不同的元组?
想象一下具有以下分区的RDD
在这个RDD的一个独特的地方,所有重复的密钥(分区1中的2s和分区2中的5s)是否会被混洗到它们的目标分区,或者只有每个分区的不同密钥被洗牌到目标?
如果所有键都被洗牌,那么带有set()操作的aggregate()将减少shuffle.
def set_update(u, v):
u.add(v)
return u
rdd.aggregate(set(), set_update, lambda u1,u2: u1|u2)
Run Code Online (Sandbox Code Playgroud)