@@ -294,46 +294,24 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
294294 }
295295 }
296296
297-
298- object BroadcastNestedLoopJoin extends Strategy {
297+ object BroadcastNestedLoop extends Strategy {
299298 def apply (plan : LogicalPlan ): Seq [SparkPlan ] = plan match {
300- case logical.Join (left, right, joinType, condition) =>
301- val buildSide =
302- if (right.statistics.sizeInBytes <= left.statistics.sizeInBytes) {
303- joins.BuildRight
304- } else {
305- joins.BuildLeft
306- }
307- joins.BroadcastNestedLoopJoin (
308- planLater(left), planLater(right), buildSide, joinType, condition) :: Nil
299+ case logical.Join (
300+ CanBroadcast (left), right, joinType, condition) if joinType != LeftSemiJoin =>
301+ execution.joins.BroadcastNestedLoopJoin (
302+ planLater(left), planLater(right), joins.BuildLeft , joinType, condition) :: Nil
303+ case logical.Join (
304+ left, CanBroadcast (right), joinType, condition) if joinType != LeftSemiJoin =>
305+ execution.joins.BroadcastNestedLoopJoin (
306+ planLater(left), planLater(right), joins.BuildRight , joinType, condition) :: Nil
309307 case _ => Nil
310308 }
311309 }
312310
313311 object CartesianProduct extends Strategy {
314312 def apply (plan : LogicalPlan ): Seq [SparkPlan ] = plan match {
315- // Not like the equal-join, BroadcastNestedLoopJoin doesn't support condition
316- // for cartesian join, as in cartesian join, probably, the records satisfy the
317- // condition, but exists in another partition of the large table, so we may not able
318- // to eliminate the duplicates.
319- case logical.Join (
320- CanBroadcast (left), right, joinType @ (FullOuter | LeftOuter | RightOuter ), None ) =>
321- execution.joins.BroadcastNestedLoopJoin (
322- planLater(left), planLater(right), joins.BuildLeft , joinType, None ) :: Nil
323- case logical.Join (
324- left, CanBroadcast (right), joinType @ (FullOuter | LeftOuter | RightOuter ), None ) =>
325- execution.joins.BroadcastNestedLoopJoin (
326- planLater(left), planLater(right), joins.BuildRight , joinType, None ) :: Nil
327- // Since BroadCastNestedLoopJoin supports condition already, we simply passed it down.
328- case logical.Join (
329- CanBroadcast (left), right, Inner , condition) =>
330- execution.joins.BroadcastNestedLoopJoin (
331- planLater(left), planLater(right), joins.BuildLeft , Inner , condition) :: Nil
332- case logical.Join (
333- left, CanBroadcast (right), Inner , condition) =>
334- execution.joins.BroadcastNestedLoopJoin (
335- planLater(left), planLater(right), joins.BuildRight , Inner , condition) :: Nil
336- case logical.Join (left, right, _, None ) =>
313+ // TODO CartesianProduct doesn't support the Left Semi Join
314+ case logical.Join (left, right, joinType, None ) if joinType != LeftSemiJoin =>
337315 execution.joins.CartesianProduct (planLater(left), planLater(right)) :: Nil
338316 case logical.Join (left, right, Inner , Some (condition)) =>
339317 execution.Filter (condition,
@@ -342,6 +320,21 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
342320 }
343321 }
344322
323+ object DefaultJoin extends Strategy {
324+ def apply (plan : LogicalPlan ): Seq [SparkPlan ] = plan match {
325+ case logical.Join (left, right, joinType, condition) =>
326+ val buildSide =
327+ if (right.statistics.sizeInBytes <= left.statistics.sizeInBytes) {
328+ joins.BuildRight
329+ } else {
330+ joins.BuildLeft
331+ }
332+ joins.BroadcastNestedLoopJoin (
333+ planLater(left), planLater(right), buildSide, joinType, condition) :: Nil
334+ case _ => Nil
335+ }
336+ }
337+
345338 protected lazy val singleRowRdd = sparkContext.parallelize(Seq (InternalRow ()), 1 )
346339
347340 object TakeOrderedAndProject extends Strategy {
0 commit comments