为什么case类在spark-sql中返回数据帧



下面只是以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

由于LogicalPlanSQLContext相结合是创建DataFrame所需的唯一东西,因此它看起来是进行转换的好地方。现在是:

@inline private implicit def logicalPlanToDataFrame(logicalPlan: LogicalPlan): 
    DataFrame = {
  new DataFrame(sqlContext, logicalPlan)
}

实际上,这种转换已在1.6.0中被SPARK-11513删除,并有以下描述:

DataFrame有一个内部隐式转换,它将LogicalPlan转换为DataFrame。这让一些新的贡献者感到相当困惑。既然它不会给我们带来太多好处,我们就应该去掉这种隐含的转换。

相关内容

  • 没有找到相关文章

最新更新