2017-05-04 67 views
1

我需要将使用Spark SQL的连接操作转换为自定义连接。 (对自定义物理计划的逻辑计划)。 我写了转变火花联接操作的自定义策略加入Spark:Catalyst在Dataframe上添加策略

object CustomStrategy extends Strategy { 
     def apply(plan: LogicalPlan): Seq[SparkPlan] = plan match { 
     case Join(left, right, Inner, Some(condition)) 
     => CustomJoin(df1, df2, left.output:: right.output) :: Nil 
    case _ => Nil } } 

是否有可能表达对Dataframes的CustomJoin操作,而不是logicalPlan?意思是把两个数据帧作为输入?

回答

0

不可以。您应该从SparkPlan(甚至不是LogicalPlan!)对象组装程序执行树。而且您无法在物理层面上使用数据框,因为Dataframe本身就是计划生成的主题。

但是,您可以调用planLater(logicalPlan)方法来询问后者的策略,为您提供SparkPlan并将其传递给您的CustomJoin。然后在doExecute方法中,您可以调用子方法来获取RDD。