DataFrame是一种经过优化的分布式表格集合。由于它保持了表格格式(类似于SQL表),因此可以维护元数据,从而允许Spark在后台执行一些优化。
这些优化是由一些辅助项目(如Catalyst和Tungsten)执行的。
RDD不维护任何模式,如果需要,您需要提供一个模式。因此,RDD不像DataFrame那样高度优化(Catalyst根本没有参与)。
将DataFrame转换为RDD会强制Spark循环遍历所有元素,将它们从高度优化的Catalyst空间转换为scala空间。
请查看来自.rdd
的代码。
lazy val rdd: RDD[T] = {
val objectType = exprEnc.deserializer.dataType
rddQueryExecution.toRdd.mapPartitions { rows =>
rows.map(_.get(0, objectType).asInstanceOf[T])
}
}
@transient private lazy val rddQueryExecution: QueryExecution = {
val deserialized = CatalystSerde.deserialize[T](logicalPlan)
sparkSession.sessionState.executePlan(deserialized)
}
RDD [InternalRow]
检索出来,正如名称所示,仅供内部使用,需要转换为RDD [Row]
然后循环遍历所有行并将它们转换。如您所见,不仅仅是删除模式。