在org.apache.spark.sql.execution中实现了有所有的数据库操作,但是注意这里仅仅是物理算子,这些操作分为三类:UnaryNode,LeafNode和BinaryNode。
一元节点UnaryNode的操作有:
Aggregate,DebugNode,EXchange,Filter,Generate,Project,Sample,Sort,StopAfter,TopK。
二元节点BinaryNode的操作有:
BroadcastNestedLoopJoin,CartesianProduct,SparkEquiInnerJoin。
叶子节点LeftNode的操作有:
ExistingRdd,ParquetTableScan。
分析一下join操作,join有两个孩子节点,是二元算子,其中会添加projection算子。有一种情况,比如T1表的a,b,c三个属性和T2表的a,d,e三个属性,如果在T1和T2表的a属性上做连接,最后输出三个属性T1.a,T1.b,T2.d。这样的话首先会在T1表上添加projection将a,b属性选出来,然后在T2表上添加Projection将a,d属性选出来,然后连接选出的属性,SparkEquiInnerJoin物理算子如下:
case class SparkEquiInnerJoin(
leftKeys: Seq[Expression],
rightKeys: Seq[Exp