下面只是以Union为例。
我正在阅读spark-sql源代码,并了解了这段代码,它位于DataFrame.scala 中
def unionAll(other: DataFrame): DataFrame = Union(logicalPlan, other.logicalPlan)
Union是一个案例类,其定义类似于
case class Union(left: LogicalPlan, right: LogicalPlan) extends BinaryNode {...}
我很困惑,如何将结果视为DataFrame类型的实例?
好吧,如果Scala中有什么不清楚的地方,那就必须是implicit
。首先让我们看一下BinaryNode
节点定义:
abstract class BinaryNode extends LogicalPlan
由于LogicalPlan
与SQLContext
相结合是创建DataFrame
所需的唯一东西,因此它看起来是进行转换的好地方。现在是:
@inline private implicit def logicalPlanToDataFrame(logicalPlan: LogicalPlan):
DataFrame = {
new DataFrame(sqlContext, logicalPlan)
}
实际上,这种转换已在1.6.0中被SPARK-11513删除,并有以下描述:
DataFrame有一个内部隐式转换,它将LogicalPlan转换为DataFrame。这让一些新的贡献者感到相当困惑。既然它不会给我们带来太多好处,我们就应该去掉这种隐含的转换。