Zhang Xinyu created HIVE-3331:
---------------------------------

             Summary: plan for union all followed by mapjoin may be wrong
                 Key: HIVE-3331
                 URL: https://issues.apache.org/jira/browse/HIVE-3331
             Project: Hive
          Issue Type: Bug
          Components: SQL
    Affects Versions: 0.8.1
            Reporter: Zhang Xinyu


test query:
{code}
explain create table union_mapjoin as select * from (select /*+ MAPJOIN(a) */ 
a.key keya, a.value valuea, b2.key b2key, b2.value b2value
    from
    join_src a join
    (select key, value from join_src where key = 11 limit 1 
        union all 
        select key, value from join_src where key = 22 limit 1 
    ) b2 
    on a.key = b2.key)sub limit 10000;
{code}
I got result:
{code}

STAGE DEPENDENCIES:
  Stage-4 is a root stage
  Stage-6 is a root stage
  Stage-7 is a root stage
  Stage-1 depends on stages: Stage-7
  Stage-2 depends on stages: Stage-1
  Stage-0 depends on stages: Stage-2
  Stage-8 depends on stages: Stage-0
  Stage-3 depends on stages: Stage-8

STAGE PLANS:
  Stage: Stage-4
    Map Reduce
      Alias -> Map Operator Tree:
        sub-subquery1:b2-subquery1:join_src 
          TableScan
            alias: join_src
            Filter Operator
              predicate:
                  expr: (key = 11)
                  type: boolean
              Select Operator
                expressions:
                      expr: key
                      type: string
                      expr: value
                      type: string
                outputColumnNames: _col0, _col1
                Limit
                  Reduce Output Operator
                    sort order: 
                    tag: -1
                    value expressions:
                          expr: _col0
                          type: string
                          expr: _col1
                          type: string
      Reduce Operator Tree:
        Extract
          Limit
            File Output Operator
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                  output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

  Stage: Stage-6
    Map Reduce
      Alias -> Map Operator Tree:
        sub-subquery2:b2-subquery2:join_src 
          TableScan
            alias: join_src
            Filter Operator
              predicate:
                  expr: (key = 22)
                  type: boolean
              Select Operator
                expressions:
                      expr: key
                      type: string
                      expr: value
                      type: string
                outputColumnNames: _col0, _col1
                Limit
                  Reduce Output Operator
                    sort order: 
                    tag: -1
                    value expressions:
                          expr: _col0
                          type: string
                          expr: _col1
                          type: string
      Reduce Operator Tree:
        Extract
          Limit
            File Output Operator
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                  output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

  Stage: Stage-7
    Map Reduce Local Work
      Alias -> Map Local Tables:
        sub:a 
          Fetch Operator
            limit: -1
      Alias -> Map Local Operator Tree:
        sub:a 
          TableScan
            alias: a
            HashTable Sink Operator
              condition expressions:
                0 {key} {value}
                1 {_col0} {_col1}
              handleSkewJoin: false
              keys:
                0 [Column[key]]
                1 [Column[_col0]]
              Position of Big Table: 1

  Stage: Stage-1
    Map Reduce
      Local Work:
        Map Reduce Local Work

  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        
file:/tmp/hive-xinyu/hive_2012-08-03_17-07-18_694_3666415239747373912/-mr-10002 
          Select Operator
            expressions:
                  expr: _col0
                  type: string
                  expr: _col1
                  type: string
                  expr: _col4
                  type: string
                  expr: _col5
                  type: string
            outputColumnNames: _col0, _col1, _col4, _col5
            Select Operator
              expressions:
                    expr: _col0
                    type: string
                    expr: _col1
                    type: string
                    expr: _col4
                    type: string
                    expr: _col5
                    type: string
              outputColumnNames: _col0, _col1, _col2, _col3
              Select Operator
                expressions:
                      expr: _col0
                      type: string
                      expr: _col1
                      type: string
                      expr: _col2
                      type: string
                      expr: _col3
                      type: string
                outputColumnNames: _col0, _col1, _col2, _col3
                Limit
                  Reduce Output Operator
                    sort order: 
                    tag: -1
                    value expressions:
                          expr: _col0
                          type: string
                          expr: _col1
                          type: string
                          expr: _col2
                          type: string
                          expr: _col3
                          type: string
      Reduce Operator Tree:
        Extract
          Limit
            File Output Operator
              compressed: false
              GlobalTableId: 1
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: 
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                  name: default.union_mapjoin

  Stage: Stage-0
    Move Operator
      <...>
  Stage: Stage-8
      Create Table Operator:
      <...>
{code}
what's wrong with Stage-1?

In code (about line 362):
{code:title=ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinFactory.java}

      // If the plan for this reducer does not exist, initialize the plan       
                                                                            
      if (opMapTask == null) {
        assert currPlan.getReducer() == null;
        ctx.setCurrMapJoinOp(mapJoin);
        GenMapRedUtils.initMapJoinPlan(mapJoin, ctx, true, true, false, pos);
        ctx.setCurrUnionOp(null);
      } else {
        // The current plan can be thrown away after being merged with the      
                                                                            
        // original plan
        // Does here lose: ctx.setCurrMapJoinOp(mapJoin); ?                     
                                                                                
                
        Task<? extends Serializable> uTask = ctx.getUnionTask(
            ctx.getCurrUnionOp()).getUTask();
        if (uTask.getId().equals(opMapTask.getId())) {
          GenMapRedUtils.joinPlan(mapJoin, null, opMapTask, ctx, pos, false,
              false, true);
        } else {
          GenMapRedUtils.joinPlan(mapJoin, uTask, opMapTask, ctx, pos, false,
              false, true);
        }
        currTask = opMapTask;
        ctx.setCurrTask(currTask);
      }
{code}
Does the "else" block forget to set "setCurrMapJoinOp"? I hack the code as so, 
and get the plan what I want.

plan after my modification:
{code}
STAGE DEPENDENCIES:
  Stage-4 is a root stage
  Stage-7 depends on stages: Stage-4, Stage-6
  Stage-1 depends on stages: Stage-7
  Stage-2 depends on stages: Stage-1
  Stage-0 depends on stages: Stage-2
  Stage-8 depends on stages: Stage-0
  Stage-3 depends on stages: Stage-8
  Stage-6 is a root stage

STAGE PLANS:
  Stage: Stage-4
    Map Reduce
      Alias -> Map Operator Tree:
        sub-subquery1:b2-subquery1:join_src 
          TableScan
            alias: join_src
            Filter Operator
              predicate:
                  expr: (key = 11)
                  type: boolean
              Select Operator
                expressions:
                      expr: key
                      type: string
                      expr: value
                      type: string
                outputColumnNames: _col0, _col1
                Limit
                  Reduce Output Operator
                    sort order: 
                    tag: -1
                    value expressions:
                          expr: _col0
                          type: string
                          expr: _col1
                          type: string
      Reduce Operator Tree:
        Extract
          Limit
            File Output Operator
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                  output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

  Stage: Stage-7
    Map Reduce Local Work
      Alias -> Map Local Tables:
        sub:a 
          Fetch Operator
            limit: -1
      Alias -> Map Local Operator Tree:
        sub:a 
          TableScan
            alias: a
            HashTable Sink Operator
              condition expressions:
                0 {key} {value}
                1 {_col0} {_col1}
              handleSkewJoin: false
              keys:
                0 [Column[key]]
                1 [Column[_col0]]
              Position of Big Table: 1

  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        
file:/tmp/hive-xinyu/hive_2012-08-03_17-28-19_000_5428590854627305209/-mr-10003 
          Union
            Map Join Operator
              condition map:
                   Inner Join 0 to 1
              condition expressions:
                0 {key} {value}
                1 {_col0} {_col1}
              handleSkewJoin: false
              keys:
                0 [Column[key]]
                1 [Column[_col0]]
              outputColumnNames: _col0, _col1, _col4, _col5
              Position of Big Table: 1
              File Output Operator
                compressed: false
                GlobalTableId: 0
                table:
                    input format: 
org.apache.hadoop.mapred.SequenceFileInputFormat
                    output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
        
file:/tmp/hive-xinyu/hive_2012-08-03_17-28-19_000_5428590854627305209/-mr-10004 
          Union
            Map Join Operator
              condition map:
                   Inner Join 0 to 1
              condition expressions:
                0 {key} {value}
                1 {_col0} {_col1}
              handleSkewJoin: false
              keys:
                0 [Column[key]]
                1 [Column[_col0]]
              outputColumnNames: _col0, _col1, _col4, _col5
              Position of Big Table: 1
              File Output Operator
                compressed: false
                GlobalTableId: 0
                table:
                    input format: 
org.apache.hadoop.mapred.SequenceFileInputFormat
                    output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
      Local Work:
        Map Reduce Local Work

  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        
file:/tmp/hive-xinyu/hive_2012-08-03_17-28-19_000_5428590854627305209/-mr-10002 
          Select Operator
            expressions:
                  expr: _col0
                  type: string
                  expr: _col1
                  type: string
                  expr: _col4
                  type: string
                  expr: _col5
                  type: string
            outputColumnNames: _col0, _col1, _col4, _col5
            Select Operator
              expressions:
                    expr: _col0
                    type: string
                    expr: _col1
                    type: string
                    expr: _col4
                    type: string
                    expr: _col5
                    type: string
              outputColumnNames: _col0, _col1, _col2, _col3
              Select Operator
                expressions:
                      expr: _col0
                      type: string
                      expr: _col1
                      type: string
                      expr: _col2
                      type: string
                      expr: _col3
                      type: string
                outputColumnNames: _col0, _col1, _col2, _col3
                Limit
                  Reduce Output Operator
                    sort order: 
                    tag: -1
                    value expressions:
                          expr: _col0
                          type: string
                          expr: _col1
                          type: string
                          expr: _col2
                          type: string
                          expr: _col3
                          type: string
      Reduce Operator Tree:
        Extract
          Limit
            File Output Operator
              compressed: false
              GlobalTableId: 1
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: 
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                  name: default.union_mapjoin

  Stage: Stage-0
    Move Operator
      <...>

  Stage: Stage-8
      Create Table Operator:
      <...>

  Stage: Stage-3
    Stats-Aggr Operator

  Stage: Stage-6
    Map Reduce
      Alias -> Map Operator Tree:
        sub-subquery2:b2-subquery2:join_src 
          TableScan
            alias: join_src
            Filter Operator
              predicate:
                  expr: (key = 22)
                  type: boolean
              Select Operator
                expressions:
                      expr: key
                      type: string
                      expr: value
                      type: string
                outputColumnNames: _col0, _col1
                Limit
                  Reduce Output Operator
                    sort order: 
                    tag: -1
                    value expressions:
                          expr: _col0
                          type: string
                          expr: _col1
                          type: string
      Reduce Operator Tree:
        Extract
          Limit
            File Output Operator
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                  output format: 
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

{code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to