(JoinType, Seq[Expression], Seq[Expression], Option[Expression], LogicalPlan, LogicalPlan)
ExtractEquiJoinKeys — Scala Extractor for Destructuring Join Logical Operators
ExtractEquiJoinKeys
is a Scala extractor to destructure a Join logical operator into a tuple with the following elements:
unapply
gives None
(aka nothing) when no join keys were found or the logical plan is not a Join logical operator.
Note
|
ExtractEquiJoinKeys is a Scala object with unapply method.
|
val left = Seq((0, 1, "zero"), (1, 2, "one")).toDF("k1", "k2", "name")
val right = Seq((0, 0, "0"), (1, 1, "1")).toDF("k1", "k2", "name")
val q = left.join(right, Seq("k1", "k2", "name")).
where(left("k1") > 3)
import org.apache.spark.sql.catalyst.plans.logical.Join
val join = q.queryExecution.optimizedPlan.p(1).asInstanceOf[Join]
// make sure the join condition is available
scala> join.condition.get
res1: org.apache.spark.sql.catalyst.expressions.Expression = (((k1#148 = k1#161) && (k2#149 = k2#162)) && (name#150 = name#163))
// Enable DEBUG logging level
import org.apache.log4j.{Level, Logger}
Logger.getLogger("org.apache.spark.sql.catalyst.planning.ExtractEquiJoinKeys").setLevel(Level.DEBUG)
import org.apache.spark.sql.catalyst.planning.ExtractEquiJoinKeys
scala> ExtractEquiJoinKeys.unapply(join)
2018-03-14 12:02:14 DEBUG ExtractEquiJoinKeys:58 - Considering join on: Some((((k1#148 = k1#161) && (k2#149 = k2#162)) && (name#150 = name#163)))
2018-03-14 12:02:14 DEBUG ExtractEquiJoinKeys:58 - leftKeys:List(k1#148, k2#149, name#150) | rightKeys:List(k1#161, k2#162, name#163)
res3: Option[org.apache.spark.sql.catalyst.planning.ExtractEquiJoinKeys.ReturnType] =
Some((Inner,List(k1#148, k2#149, name#150),List(k1#161, k2#162, name#163),None,Project [_1#144 AS k1#148, _2#145 AS k2#149, _3#146 AS name#150]
+- Filter ((_1#144 > 3) && isnotnull(_3#146))
+- LocalRelation [_1#144, _2#145, _3#146]
,Project [_1#157 AS k1#161, _2#158 AS k2#162, _3#159 AS name#163]
+- Filter ((_1#157 > 3) && isnotnull(_3#159))
+- LocalRelation [_1#157, _2#158, _3#159]
))
Tip
|
Enable Add the following line to
Refer to Logging. |
Destructuring Logical Plan — unapply
Method
type ReturnType =
(JoinType, Seq[Expression], Seq[Expression], Option[Expression], LogicalPlan, LogicalPlan)
unapply(plan: LogicalPlan): Option[ReturnType]
Internally, unapply
prints out the following DEBUG message to the logs:
Considering join on: [condition]
unapply
then splits condition
at And
expression points (if there are any) to have a list of predicate expressions.
Caution
|
FIXME Example with a condition with multiple predicates separated by ANDs. |
unapply
finds EqualTo
and EqualNullSafe
binary expressions to collect the join keys (for the left and right side).
Caution
|
FIXME 5 examples for the different cases of EqualTo and EqualNullSafe binary expressions.
|
unapply
takes the expressions that…FIXME…to build otherPredicates
.
In the end, unapply
splits the pairs of join keys into collections of left and right join keys. unapply
prints out the following DEBUG message to the logs:
leftKeys:[leftKeys] | rightKeys:[rightKeys]
Note
|
|