You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ke...@apache.org on 2012/08/06 18:49:20 UTC
svn commit: r1369879 - in /hive/trunk: data/files/
ql/src/java/org/apache/hadoop/hive/ql/optimizer/
ql/src/test/queries/clientpositive/ ql/src/test/results/clientpositive/
Author: kevinwilfong
Date: Mon Aug 6 16:49:19 2012
New Revision: 1369879
URL: http://svn.apache.org/viewvc?rev=1369879&view=rev
Log:
HIVE-3304. sort merge join should work if both the tables are sorted in descending order. (njain via kevinwilfong)
Added:
hive/trunk/data/files/SortCol1Col2.txt (with props)
hive/trunk/data/files/SortCol2Col1.txt (with props)
hive/trunk/data/files/SortDescCol1Col2.txt (with props)
hive/trunk/data/files/SortDescCol2Col1.txt (with props)
hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_1.q
hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_2.q
hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_1.q
hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_2.q
hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_3.q
hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_4.q
hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_1.q.out
hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_2.q.out
hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_1.q.out
hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_2.q.out
hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_3.q.out
hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_4.q.out
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SortedMergeBucketMapJoinOptimizer.java
Added: hive/trunk/data/files/SortCol1Col2.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/SortCol1Col2.txt?rev=1369879&view=auto
==============================================================================
Binary file - no diff available.
Propchange: hive/trunk/data/files/SortCol1Col2.txt
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: hive/trunk/data/files/SortCol2Col1.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/SortCol2Col1.txt?rev=1369879&view=auto
==============================================================================
Binary file - no diff available.
Propchange: hive/trunk/data/files/SortCol2Col1.txt
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: hive/trunk/data/files/SortDescCol1Col2.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/SortDescCol1Col2.txt?rev=1369879&view=auto
==============================================================================
Binary file - no diff available.
Propchange: hive/trunk/data/files/SortDescCol1Col2.txt
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: hive/trunk/data/files/SortDescCol2Col1.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/SortDescCol2Col1.txt?rev=1369879&view=auto
==============================================================================
Binary file - no diff available.
Propchange: hive/trunk/data/files/SortDescCol2Col1.txt
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SortedMergeBucketMapJoinOptimizer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SortedMergeBucketMapJoinOptimizer.java?rev=1369879&r1=1369878&r2=1369879&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SortedMergeBucketMapJoinOptimizer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SortedMergeBucketMapJoinOptimizer.java Mon Aug 6 16:49:19 2012
@@ -49,7 +49,6 @@ import org.apache.hadoop.hive.ql.metadat
import org.apache.hadoop.hive.ql.metadata.Partition;
import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.optimizer.ppr.PartitionPruner;
-import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
import org.apache.hadoop.hive.ql.parse.ParseContext;
import org.apache.hadoop.hive.ql.parse.PrunedPartitionList;
import org.apache.hadoop.hive.ql.parse.QBJoinTree;
@@ -136,9 +135,21 @@ public class SortedMergeBucketMapJoinOpt
}
String[] srcs = joinCxt.getBaseSrc();
int pos = 0;
+
+ // All the tables/partitions columns should be sorted in the same order
+ // For example, if tables A and B are being joined on columns c1, c2 and c3
+ // which are the sorted and bucketed columns. The join would work, as long
+ // c1, c2 and c3 are sorted in the same order.
+ List<Order> sortColumnsFirstTable = new ArrayList<Order>();
+
for (String src : srcs) {
tableSorted = tableSorted
- && isTableSorted(this.pGraphContext, mapJoinOp, joinCxt, src, pos);
+ && isTableSorted(this.pGraphContext,
+ mapJoinOp,
+ joinCxt,
+ src,
+ pos,
+ sortColumnsFirstTable);
pos++;
}
if (!tableSorted) {
@@ -202,8 +213,27 @@ public class SortedMergeBucketMapJoinOpt
return smbJop;
}
- private boolean isTableSorted(ParseContext pctx, MapJoinOperator op,
- QBJoinTree joinTree, String alias, int pos) throws SemanticException {
+ /**
+ * Whether this table is eligible for a sort-merge join.
+ *
+ * @param pctx parse context
+ * @param op map join operator being considered
+ * @param joinTree join tree being considered
+ * @param alias table alias in the join tree being checked
+ * @param pos position of the table
+ * @param sortColumnsFirstTable The names and order of the sorted columns for the first table.
+ * It is not initialized when pos = 0.
+ * @return
+ * @throws SemanticException
+ */
+ private boolean isTableSorted(ParseContext pctx,
+ MapJoinOperator op,
+ QBJoinTree joinTree,
+ String alias,
+ int pos,
+ List<Order> sortColumnsFirstTable)
+ throws SemanticException {
+
Map<String, Operator<? extends Serializable>> topOps = this.pGraphContext
.getTopOps();
Map<TableScanOperator, Table> topToTable = this.pGraphContext
@@ -256,30 +286,57 @@ public class SortedMergeBucketMapJoinOpt
LOG.error(org.apache.hadoop.util.StringUtils.stringifyException(e));
throw new SemanticException(e.getMessage(), e);
}
+ List<Partition> partitions = prunedParts.getNotDeniedPartns();
+ // Populate the names and order of columns for the first partition of the
+ // first table
+ if ((pos == 0) && (partitions != null) && (!partitions.isEmpty())) {
+ Partition firstPartition = partitions.get(0);
+ sortColumnsFirstTable.addAll(firstPartition.getSortCols());
+ }
+
for (Partition partition : prunedParts.getNotDeniedPartns()) {
- if (!checkSortColsAndJoinCols(partition.getSortCols(), joinCols)) {
+ if (!checkSortColsAndJoinCols(partition.getSortCols(),
+ joinCols,
+ sortColumnsFirstTable)) {
return false;
}
}
return true;
}
- return checkSortColsAndJoinCols(tbl.getSortCols(), joinCols);
+
+ // Populate the names and order of columns for the first table
+ if (pos == 0) {
+ sortColumnsFirstTable.addAll(tbl.getSortCols());
+ }
+
+ return checkSortColsAndJoinCols(tbl.getSortCols(),
+ joinCols,
+ sortColumnsFirstTable);
}
private boolean checkSortColsAndJoinCols(List<Order> sortCols,
- List<String> joinCols) {
+ List<String> joinCols,
+ List<Order> sortColumnsFirstPartition) {
+
if (sortCols == null || sortCols.size() != joinCols.size()) {
return false;
}
- // require all sort columns are asc, right now only support asc
+
List<String> sortColNames = new ArrayList<String>();
- for (Order o : sortCols) {
- if (o.getOrder() != BaseSemanticAnalyzer.HIVE_COLUMN_ORDER_ASC) {
+
+ // The join columns should contain all the sort columns
+ // The sort columns of all the tables should be in the same order
+ // compare the column names and the order with the first table/partition.
+ for (int pos = 0; pos < sortCols.size(); pos++) {
+ Order o = sortCols.get(pos);
+ if (!o.equals(sortColumnsFirstPartition.get(pos))) {
return false;
}
- sortColNames.add(o.getCol());
+ sortColNames.add(sortColumnsFirstPartition.get(pos).getCol());
}
+ // The column names and order (ascending/descending) matched
+ // The join columns should contain sort columns
return sortColNames.containsAll(joinCols);
}
}
Added: hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_1.q?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_1.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_1.q Mon Aug 6 16:49:19 2012
@@ -0,0 +1,27 @@
+drop table table1;
+drop table table2;
+
+set hive.enforce.bucketing = true;
+set hive.enforce.sorting = true;
+
+create table table1(key string, value string) clustered by (key, value)
+sorted by (key, value) into 1 BUCKETS stored as textfile;
+create table table2(key string, value string) clustered by (value, key)
+sorted by (value, key) into 1 BUCKETS stored as textfile;
+
+load data local inpath '../data/files/SortCol1Col2.txt' overwrite into table table1;
+load data local inpath '../data/files/SortCol2Col1.txt' overwrite into table table2;
+
+set hive.optimize.bucketmapjoin = true;
+set hive.optimize.bucketmapjoin.sortedmerge = true;
+set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
+
+-- The tables are bucketed in same columns in different order,
+-- but sorted in different column orders
+-- Bucketed map-join should be performed, not sort-merge join
+
+explain extended
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value;
+
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value;
+
Added: hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_2.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_2.q?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_2.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/bucket_map_join_2.q Mon Aug 6 16:49:19 2012
@@ -0,0 +1,27 @@
+drop table table1;
+drop table table2;
+
+set hive.enforce.bucketing = true;
+set hive.enforce.sorting = true;
+
+create table table1(key string, value string) clustered by (key, value)
+sorted by (key desc, value desc) into 1 BUCKETS stored as textfile;
+create table table2(key string, value string) clustered by (value, key)
+sorted by (value desc, key desc) into 1 BUCKETS stored as textfile;
+
+load data local inpath '../data/files/SortCol1Col2.txt' overwrite into table table1;
+load data local inpath '../data/files/SortCol2Col1.txt' overwrite into table table2;
+
+set hive.optimize.bucketmapjoin = true;
+set hive.optimize.bucketmapjoin.sortedmerge = true;
+set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
+
+-- The tables are bucketed in same columns in different order,
+-- but sorted in different column orders
+-- Bucketed map-join should be performed, not sort-merge join
+
+explain extended
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value;
+
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value;
+
Added: hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_1.q?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_1.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_1.q Mon Aug 6 16:49:19 2012
@@ -0,0 +1,23 @@
+drop table table_desc1;
+drop table table_desc2;
+
+set hive.enforce.sorting = true;
+
+create table table_desc1(key string, value string) clustered by (key) sorted by (key DESC) into 1 BUCKETS;
+create table table_desc2(key string, value string) clustered by (key) sorted by (key DESC) into 1 BUCKETS;
+
+insert overwrite table table_desc1 select key, value from src;
+insert overwrite table table_desc2 select key, value from src;
+
+set hive.optimize.bucketmapjoin = true;
+set hive.optimize.bucketmapjoin.sortedmerge = true;
+set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
+
+-- The columns of the tables above are sorted in same descending order.
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b on a.key=b.key where a.key < 10;
+
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b on a.key=b.key where a.key < 10;
+
Added: hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_2.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_2.q?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_2.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_2.q Mon Aug 6 16:49:19 2012
@@ -0,0 +1,28 @@
+drop table table_desc1;
+drop table table_desc2;
+
+set hive.enforce.sorting = true;
+
+create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS;
+create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS;
+
+insert overwrite table table_desc1 select key, value from src;
+insert overwrite table table_desc2 select key, value from src;
+
+set hive.optimize.bucketmapjoin = true;
+set hive.optimize.bucketmapjoin.sortedmerge = true;
+set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
+
+-- The columns of the tables above are sorted in same order.
+-- descending followed by descending
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10;
+
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10;
+
Added: hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_3.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_3.q?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_3.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_3.q Mon Aug 6 16:49:19 2012
@@ -0,0 +1,28 @@
+drop table table_desc1;
+drop table table_desc2;
+
+set hive.enforce.sorting = true;
+
+create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS;
+create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS;
+
+insert overwrite table table_desc1 select key, value from src;
+insert overwrite table table_desc2 select key, value from src;
+
+set hive.optimize.bucketmapjoin = true;
+set hive.optimize.bucketmapjoin.sortedmerge = true;
+set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
+
+-- The columns of the tables above are sorted in same orders.
+-- descending followed by ascending
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10;
+
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10;
+
Added: hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_4.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_4.q?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_4.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/sort_merge_join_desc_4.q Mon Aug 6 16:49:19 2012
@@ -0,0 +1,27 @@
+drop table table_desc1;
+drop table table_desc2;
+
+set hive.enforce.sorting = true;
+
+create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS;
+create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS;
+
+insert overwrite table table_desc1 select key, value from src;
+insert overwrite table table_desc2 select key, value from src;
+
+set hive.optimize.bucketmapjoin = true;
+set hive.optimize.bucketmapjoin.sortedmerge = true;
+set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
+
+-- The columns of the tables above are sorted in different orders.
+-- So, sort merge join should not be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10;
+
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10;
+
Added: hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_1.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_1.q.out?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_1.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_1.q.out Mon Aug 6 16:49:19 2012
@@ -0,0 +1,246 @@
+PREHOOK: query: drop table table1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table table2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table table1(key string, value string) clustered by (key, value)
+sorted by (key, value) into 1 BUCKETS stored as textfile
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table1(key string, value string) clustered by (key, value)
+sorted by (key, value) into 1 BUCKETS stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table1
+PREHOOK: query: create table table2(key string, value string) clustered by (value, key)
+sorted by (value, key) into 1 BUCKETS stored as textfile
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table2(key string, value string) clustered by (value, key)
+sorted by (value, key) into 1 BUCKETS stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table2
+PREHOOK: query: load data local inpath '../data/files/SortCol1Col2.txt' overwrite into table table1
+PREHOOK: type: LOAD
+PREHOOK: Output: default@table1
+POSTHOOK: query: load data local inpath '../data/files/SortCol1Col2.txt' overwrite into table table1
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@table1
+PREHOOK: query: load data local inpath '../data/files/SortCol2Col1.txt' overwrite into table table2
+PREHOOK: type: LOAD
+PREHOOK: Output: default@table2
+POSTHOOK: query: load data local inpath '../data/files/SortCol2Col1.txt' overwrite into table table2
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@table2
+PREHOOK: query: -- The tables are bucketed in same columns in different order,
+-- but sorted in different column orders
+-- Bucketed map-join should be performed, not sort-merge join
+
+explain extended
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+PREHOOK: type: QUERY
+POSTHOOK: query: -- The tables are bucketed in same columns in different order,
+-- but sorted in different column orders
+-- Bucketed map-join should be performed, not sort-merge join
+
+explain extended
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+ (TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF (TOK_TABNAME table1) a) (TOK_TABREF (TOK_TABNAME table2) b) (and (= (. (TOK_TABLE_OR_COL a) key) (. (TOK_TABLE_OR_COL b) key)) (= (. (TOK_TABLE_OR_COL a) value) (. (TOK_TABLE_OR_COL b) value))))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_HINTLIST (TOK_HINT TOK_MAPJOIN (TOK_HINTARGLIST b))) (TOK_SELEXPR (TOK_FUNCTIONSTAR count)))))
+
+STAGE DEPENDENCIES:
+ Stage-4 is a root stage
+ Stage-1 depends on stages: Stage-4
+ Stage-2 depends on stages: Stage-1
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-4
+ Map Reduce Local Work
+ Alias -> Map Local Tables:
+ b
+ Fetch Operator
+ limit: -1
+ Alias -> Map Local Operator Tree:
+ b
+ TableScan
+ alias: b
+ GatherStats: false
+ HashTable Sink Operator
+ condition expressions:
+ 0
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ Position of Big Table: 0
+ Bucket Mapjoin Context:
+ Alias Bucket Base File Name Mapping:
+ b {SortCol1Col2.txt=[SortCol2Col1.txt]}
+ Alias Bucket File Name Mapping:
+#### A masked pattern was here ####
+ Alias Bucket Output File Name Mapping:
+#### A masked pattern was here ####
+
+ Stage: Stage-1
+ Map Reduce
+ Alias -> Map Operator Tree:
+ a
+ TableScan
+ alias: a
+ GatherStats: false
+ Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ Position of Big Table: 0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+#### A masked pattern was here ####
+ NumFilesPerFileSink: 1
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ properties:
+ columns
+ columns.types
+ escape.delim \
+ TotalFiles: 1
+ GatherStats: false
+ MultiFileSpray: false
+ Local Work:
+ Map Reduce Local Work
+ Needs Tagging: false
+ Path -> Alias:
+#### A masked pattern was here ####
+ Path -> Partition:
+#### A masked pattern was here ####
+ Partition
+ base file name: table1
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ properties:
+ SORTBUCKETCOLSPREFIX TRUE
+ bucket_count 1
+ bucket_field_name key
+ columns key,value
+ columns.types string:string
+#### A masked pattern was here ####
+ name default.table1
+ serialization.ddl struct table1 { string key, string value}
+ serialization.format 1
+ serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+#### A masked pattern was here ####
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ properties:
+ SORTBUCKETCOLSPREFIX TRUE
+ bucket_count 1
+ bucket_field_name key
+ columns key,value
+ columns.types string:string
+#### A masked pattern was here ####
+ name default.table1
+ serialization.ddl struct table1 { string key, string value}
+ serialization.format 1
+ serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+#### A masked pattern was here ####
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+ name: default.table1
+ name: default.table1
+
+ Stage: Stage-2
+ Map Reduce
+ Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+ Select Operator
+ Select Operator
+ Group By Operator
+ aggregations:
+ expr: count()
+ bucketGroup: false
+ mode: hash
+ outputColumnNames: _col0
+ Reduce Output Operator
+ sort order:
+ tag: -1
+ value expressions:
+ expr: _col0
+ type: bigint
+ Needs Tagging: false
+ Path -> Alias:
+#### A masked pattern was here ####
+ Path -> Partition:
+#### A masked pattern was here ####
+ Partition
+ base file name: -mr-10002
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ properties:
+ columns
+ columns.types
+ escape.delim \
+
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ properties:
+ columns
+ columns.types
+ escape.delim \
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations:
+ expr: count(VALUE._col0)
+ bucketGroup: false
+ mode: mergepartial
+ outputColumnNames: _col0
+ Select Operator
+ expressions:
+ expr: _col0
+ type: bigint
+ outputColumnNames: _col0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+#### A masked pattern was here ####
+ NumFilesPerFileSink: 1
+#### A masked pattern was here ####
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ properties:
+ columns _col0
+ columns.types bigint
+ escape.delim \
+ serialization.format 1
+ TotalFiles: 1
+ GatherStats: false
+ MultiFileSpray: false
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+
+PREHOOK: query: select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1
+PREHOOK: Input: default@table2
+#### A masked pattern was here ####
+POSTHOOK: query: select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1
+POSTHOOK: Input: default@table2
+#### A masked pattern was here ####
+4
Added: hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_2.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_2.q.out?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_2.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/bucket_map_join_2.q.out Mon Aug 6 16:49:19 2012
@@ -0,0 +1,246 @@
+PREHOOK: query: drop table table1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table table2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table table1(key string, value string) clustered by (key, value)
+sorted by (key desc, value desc) into 1 BUCKETS stored as textfile
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table1(key string, value string) clustered by (key, value)
+sorted by (key desc, value desc) into 1 BUCKETS stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table1
+PREHOOK: query: create table table2(key string, value string) clustered by (value, key)
+sorted by (value desc, key desc) into 1 BUCKETS stored as textfile
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table2(key string, value string) clustered by (value, key)
+sorted by (value desc, key desc) into 1 BUCKETS stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table2
+PREHOOK: query: load data local inpath '../data/files/SortCol1Col2.txt' overwrite into table table1
+PREHOOK: type: LOAD
+PREHOOK: Output: default@table1
+POSTHOOK: query: load data local inpath '../data/files/SortCol1Col2.txt' overwrite into table table1
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@table1
+PREHOOK: query: load data local inpath '../data/files/SortCol2Col1.txt' overwrite into table table2
+PREHOOK: type: LOAD
+PREHOOK: Output: default@table2
+POSTHOOK: query: load data local inpath '../data/files/SortCol2Col1.txt' overwrite into table table2
+POSTHOOK: type: LOAD
+POSTHOOK: Output: default@table2
+PREHOOK: query: -- The tables are bucketed in same columns in different order,
+-- but sorted in different column orders
+-- Bucketed map-join should be performed, not sort-merge join
+
+explain extended
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+PREHOOK: type: QUERY
+POSTHOOK: query: -- The tables are bucketed in same columns in different order,
+-- but sorted in different column orders
+-- Bucketed map-join should be performed, not sort-merge join
+
+explain extended
+select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+ (TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF (TOK_TABNAME table1) a) (TOK_TABREF (TOK_TABNAME table2) b) (and (= (. (TOK_TABLE_OR_COL a) key) (. (TOK_TABLE_OR_COL b) key)) (= (. (TOK_TABLE_OR_COL a) value) (. (TOK_TABLE_OR_COL b) value))))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_HINTLIST (TOK_HINT TOK_MAPJOIN (TOK_HINTARGLIST b))) (TOK_SELEXPR (TOK_FUNCTIONSTAR count)))))
+
+STAGE DEPENDENCIES:
+ Stage-4 is a root stage
+ Stage-1 depends on stages: Stage-4
+ Stage-2 depends on stages: Stage-1
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-4
+ Map Reduce Local Work
+ Alias -> Map Local Tables:
+ b
+ Fetch Operator
+ limit: -1
+ Alias -> Map Local Operator Tree:
+ b
+ TableScan
+ alias: b
+ GatherStats: false
+ HashTable Sink Operator
+ condition expressions:
+ 0
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ Position of Big Table: 0
+ Bucket Mapjoin Context:
+ Alias Bucket Base File Name Mapping:
+ b {SortCol1Col2.txt=[SortCol2Col1.txt]}
+ Alias Bucket File Name Mapping:
+#### A masked pattern was here ####
+ Alias Bucket Output File Name Mapping:
+#### A masked pattern was here ####
+
+ Stage: Stage-1
+ Map Reduce
+ Alias -> Map Operator Tree:
+ a
+ TableScan
+ alias: a
+ GatherStats: false
+ Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ Position of Big Table: 0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+#### A masked pattern was here ####
+ NumFilesPerFileSink: 1
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ properties:
+ columns
+ columns.types
+ escape.delim \
+ TotalFiles: 1
+ GatherStats: false
+ MultiFileSpray: false
+ Local Work:
+ Map Reduce Local Work
+ Needs Tagging: false
+ Path -> Alias:
+#### A masked pattern was here ####
+ Path -> Partition:
+#### A masked pattern was here ####
+ Partition
+ base file name: table1
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ properties:
+ SORTBUCKETCOLSPREFIX TRUE
+ bucket_count 1
+ bucket_field_name key
+ columns key,value
+ columns.types string:string
+#### A masked pattern was here ####
+ name default.table1
+ serialization.ddl struct table1 { string key, string value}
+ serialization.format 1
+ serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+#### A masked pattern was here ####
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ properties:
+ SORTBUCKETCOLSPREFIX TRUE
+ bucket_count 1
+ bucket_field_name key
+ columns key,value
+ columns.types string:string
+#### A masked pattern was here ####
+ name default.table1
+ serialization.ddl struct table1 { string key, string value}
+ serialization.format 1
+ serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+#### A masked pattern was here ####
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+ name: default.table1
+ name: default.table1
+
+ Stage: Stage-2
+ Map Reduce
+ Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+ Select Operator
+ Select Operator
+ Group By Operator
+ aggregations:
+ expr: count()
+ bucketGroup: false
+ mode: hash
+ outputColumnNames: _col0
+ Reduce Output Operator
+ sort order:
+ tag: -1
+ value expressions:
+ expr: _col0
+ type: bigint
+ Needs Tagging: false
+ Path -> Alias:
+#### A masked pattern was here ####
+ Path -> Partition:
+#### A masked pattern was here ####
+ Partition
+ base file name: -mr-10002
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ properties:
+ columns
+ columns.types
+ escape.delim \
+
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ properties:
+ columns
+ columns.types
+ escape.delim \
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations:
+ expr: count(VALUE._col0)
+ bucketGroup: false
+ mode: mergepartial
+ outputColumnNames: _col0
+ Select Operator
+ expressions:
+ expr: _col0
+ type: bigint
+ outputColumnNames: _col0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+#### A masked pattern was here ####
+ NumFilesPerFileSink: 1
+#### A masked pattern was here ####
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ properties:
+ columns _col0
+ columns.types bigint
+ escape.delim \
+ serialization.format 1
+ TotalFiles: 1
+ GatherStats: false
+ MultiFileSpray: false
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+
+PREHOOK: query: select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1
+PREHOOK: Input: default@table2
+#### A masked pattern was here ####
+POSTHOOK: query: select /*+ mapjoin(b) */ count(*) from table1 a join table2 b on a.key=b.key and a.value=b.value
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1
+POSTHOOK: Input: default@table2
+#### A masked pattern was here ####
+4
Added: hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_1.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_1.q.out?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_1.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_1.q.out Mon Aug 6 16:49:19 2012
@@ -0,0 +1,155 @@
+PREHOOK: query: drop table table_desc1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table table_desc2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table table_desc1(key string, value string) clustered by (key) sorted by (key DESC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc1(key string, value string) clustered by (key) sorted by (key DESC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc1
+PREHOOK: query: create table table_desc2(key string, value string) clustered by (key) sorted by (key DESC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc2(key string, value string) clustered by (key) sorted by (key DESC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc2
+PREHOOK: query: insert overwrite table table_desc1 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc1
+POSTHOOK: query: insert overwrite table table_desc1 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc1
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: insert overwrite table table_desc2 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc2
+POSTHOOK: query: insert overwrite table table_desc2 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc2
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: -- The columns of the tables above are sorted in same descending order.
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b on a.key=b.key where a.key < 10
+PREHOOK: type: QUERY
+POSTHOOK: query: -- The columns of the tables above are sorted in same descending order.
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b on a.key=b.key where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+ABSTRACT SYNTAX TREE:
+ (TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF (TOK_TABNAME table_desc1) a) (TOK_TABREF (TOK_TABNAME table_desc2) b) (= (. (TOK_TABLE_OR_COL a) key) (. (TOK_TABLE_OR_COL b) key)))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_HINTLIST (TOK_HINT TOK_MAPJOIN (TOK_HINTARGLIST b))) (TOK_SELEXPR (TOK_FUNCTIONSTAR count))) (TOK_WHERE (< (. (TOK_TABLE_OR_COL a) key) 10))))
+
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-2 depends on stages: Stage-1
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-1
+ Map Reduce
+ Alias -> Map Operator Tree:
+ a
+ TableScan
+ alias: a
+ Filter Operator
+ predicate:
+ expr: (key < 10.0)
+ type: boolean
+ Sorted Merge Bucket Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0 {key}
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key]]
+ 1 [Column[key]]
+ outputColumnNames: _col0
+ Position of Big Table: 0
+ 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-2
+ Map Reduce
+ Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+ Select Operator
+ expressions:
+ expr: _col0
+ type: string
+ outputColumnNames: _col0
+ Select Operator
+ Group By Operator
+ aggregations:
+ expr: count()
+ bucketGroup: false
+ mode: hash
+ outputColumnNames: _col0
+ Reduce Output Operator
+ sort order:
+ tag: -1
+ value expressions:
+ expr: _col0
+ type: bigint
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations:
+ expr: count(VALUE._col0)
+ bucketGroup: false
+ mode: mergepartial
+ outputColumnNames: _col0
+ Select Operator
+ expressions:
+ expr: _col0
+ type: bigint
+ outputColumnNames: _col0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+
+PREHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b on a.key=b.key where a.key < 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table_desc1
+PREHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b on a.key=b.key where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table_desc1
+POSTHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+22
Added: hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_2.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_2.q.out?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_2.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_2.q.out Mon Aug 6 16:49:19 2012
@@ -0,0 +1,165 @@
+PREHOOK: query: drop table table_desc1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table table_desc2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc1
+PREHOOK: query: create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc2
+PREHOOK: query: insert overwrite table table_desc1 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc1
+POSTHOOK: query: insert overwrite table table_desc1 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc1
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: insert overwrite table table_desc2 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc2
+POSTHOOK: query: insert overwrite table table_desc2 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc2
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: -- The columns of the tables above are sorted in same order.
+-- descending followed by descending
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+PREHOOK: type: QUERY
+POSTHOOK: query: -- The columns of the tables above are sorted in same order.
+-- descending followed by descending
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+ABSTRACT SYNTAX TREE:
+ (TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF (TOK_TABNAME table_desc1) a) (TOK_TABREF (TOK_TABNAME table_desc2) b) (and (= (. (TOK_TABLE_OR_COL a) key) (. (TOK_TABLE_OR_COL b) key)) (= (. (TOK_TABLE_OR_COL a) value) (. (TOK_TABLE_OR_COL b) value))))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_HINTLIST (TOK_HINT TOK_MAPJOIN (TOK_HINTARGLIST b))) (TOK_SELEXPR (TOK_FUNCTIONSTAR count))) (TOK_WHERE (< (. (TOK_TABLE_OR_COL a) key) 10))))
+
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-2 depends on stages: Stage-1
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-1
+ Map Reduce
+ Alias -> Map Operator Tree:
+ a
+ TableScan
+ alias: a
+ Filter Operator
+ predicate:
+ expr: (key < 10.0)
+ type: boolean
+ Sorted Merge Bucket Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0 {key}
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ outputColumnNames: _col0
+ Position of Big Table: 0
+ 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-2
+ Map Reduce
+ Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+ Select Operator
+ expressions:
+ expr: _col0
+ type: string
+ outputColumnNames: _col0
+ Select Operator
+ Group By Operator
+ aggregations:
+ expr: count()
+ bucketGroup: false
+ mode: hash
+ outputColumnNames: _col0
+ Reduce Output Operator
+ sort order:
+ tag: -1
+ value expressions:
+ expr: _col0
+ type: bigint
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations:
+ expr: count(VALUE._col0)
+ bucketGroup: false
+ mode: mergepartial
+ outputColumnNames: _col0
+ Select Operator
+ expressions:
+ expr: _col0
+ type: bigint
+ outputColumnNames: _col0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+
+PREHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table_desc1
+PREHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table_desc1
+POSTHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+22
Added: hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_3.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_3.q.out?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_3.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_3.q.out Mon Aug 6 16:49:19 2012
@@ -0,0 +1,165 @@
+PREHOOK: query: drop table table_desc1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table table_desc2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc1
+PREHOOK: query: create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc2
+PREHOOK: query: insert overwrite table table_desc1 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc1
+POSTHOOK: query: insert overwrite table table_desc1 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc1
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: insert overwrite table table_desc2 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc2
+POSTHOOK: query: insert overwrite table table_desc2 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc2
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: -- The columns of the tables above are sorted in same orders.
+-- descending followed by ascending
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+PREHOOK: type: QUERY
+POSTHOOK: query: -- The columns of the tables above are sorted in same orders.
+-- descending followed by ascending
+-- So, sort merge join should be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+ABSTRACT SYNTAX TREE:
+ (TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF (TOK_TABNAME table_desc1) a) (TOK_TABREF (TOK_TABNAME table_desc2) b) (and (= (. (TOK_TABLE_OR_COL a) key) (. (TOK_TABLE_OR_COL b) key)) (= (. (TOK_TABLE_OR_COL a) value) (. (TOK_TABLE_OR_COL b) value))))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_HINTLIST (TOK_HINT TOK_MAPJOIN (TOK_HINTARGLIST b))) (TOK_SELEXPR (TOK_FUNCTIONSTAR count))) (TOK_WHERE (< (. (TOK_TABLE_OR_COL a) key) 10))))
+
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-2 depends on stages: Stage-1
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-1
+ Map Reduce
+ Alias -> Map Operator Tree:
+ a
+ TableScan
+ alias: a
+ Filter Operator
+ predicate:
+ expr: (key < 10.0)
+ type: boolean
+ Sorted Merge Bucket Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0 {key}
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ outputColumnNames: _col0
+ Position of Big Table: 0
+ 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-2
+ Map Reduce
+ Alias -> Map Operator Tree:
+#### A masked pattern was here ####
+ Select Operator
+ expressions:
+ expr: _col0
+ type: string
+ outputColumnNames: _col0
+ Select Operator
+ Group By Operator
+ aggregations:
+ expr: count()
+ bucketGroup: false
+ mode: hash
+ outputColumnNames: _col0
+ Reduce Output Operator
+ sort order:
+ tag: -1
+ value expressions:
+ expr: _col0
+ type: bigint
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations:
+ expr: count(VALUE._col0)
+ bucketGroup: false
+ mode: mergepartial
+ outputColumnNames: _col0
+ Select Operator
+ expressions:
+ expr: _col0
+ type: bigint
+ outputColumnNames: _col0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+
+PREHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table_desc1
+PREHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table_desc1
+POSTHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+22
Added: hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_4.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_4.q.out?rev=1369879&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_4.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/sort_merge_join_desc_4.q.out Mon Aug 6 16:49:19 2012
@@ -0,0 +1,190 @@
+PREHOOK: query: drop table table_desc1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table table_desc2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table table_desc2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc1(key string, value string) clustered by (key, value)
+sorted by (key DESC, value ASC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc1
+PREHOOK: query: create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table table_desc2(key string, value string) clustered by (key, value)
+sorted by (key DESC, value DESC) into 1 BUCKETS
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@table_desc2
+PREHOOK: query: insert overwrite table table_desc1 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc1
+POSTHOOK: query: insert overwrite table table_desc1 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc1
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: insert overwrite table table_desc2 select key, value from src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table_desc2
+POSTHOOK: query: insert overwrite table table_desc2 select key, value from src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table_desc2
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: -- The columns of the tables above are sorted in different orders.
+-- So, sort merge join should not be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+PREHOOK: type: QUERY
+POSTHOOK: query: -- The columns of the tables above are sorted in different orders.
+-- So, sort merge join should not be performed
+
+explain
+select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+ABSTRACT SYNTAX TREE:
+ (TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF (TOK_TABNAME table_desc1) a) (TOK_TABREF (TOK_TABNAME table_desc2) b) (and (= (. (TOK_TABLE_OR_COL a) key) (. (TOK_TABLE_OR_COL b) key)) (= (. (TOK_TABLE_OR_COL a) value) (. (TOK_TABLE_OR_COL b) value))))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_HINTLIST (TOK_HINT TOK_MAPJOIN (TOK_HINTARGLIST b))) (TOK_SELEXPR (TOK_FUNCTIONSTAR count))) (TOK_WHERE (< (. (TOK_TABLE_OR_COL a) key) 10))))
+
+STAGE DEPENDENCIES:
+ Stage-4 is a root stage
+ Stage-1 depends on stages: Stage-4
+ Stage-2 depends on stages: Stage-1
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-4
+ Map Reduce Local Work
+ Alias -> Map Local Tables:
+ b
+ Fetch Operator
+ limit: -1
+ Alias -> Map Local Operator Tree:
+ b
+ TableScan
+ alias: b
+ Filter Operator
+ predicate:
+ expr: (key < 10.0)
+ type: boolean
+ HashTable Sink Operator
+ condition expressions:
+ 0 {key}
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ Position of Big Table: 0
+
+ Stage: Stage-1
+ Map Reduce
+ Alias -> Map Operator Tree:
+ a
+ TableScan
+ alias: a
+ Filter Operator
+ predicate:
+ expr: (key < 10.0)
+ type: boolean
+ Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0 {key}
+ 1
+ handleSkewJoin: false
+ keys:
+ 0 [Column[key], Column[value]]
+ 1 [Column[key], Column[value]]
+ outputColumnNames: _col0
+ Position of Big Table: 0
+ 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:
+#### A masked pattern was here ####
+ Select Operator
+ expressions:
+ expr: _col0
+ type: string
+ outputColumnNames: _col0
+ Select Operator
+ Group By Operator
+ aggregations:
+ expr: count()
+ bucketGroup: false
+ mode: hash
+ outputColumnNames: _col0
+ Reduce Output Operator
+ sort order:
+ tag: -1
+ value expressions:
+ expr: _col0
+ type: bigint
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations:
+ expr: count(VALUE._col0)
+ bucketGroup: false
+ mode: mergepartial
+ outputColumnNames: _col0
+ Select Operator
+ expressions:
+ expr: _col0
+ type: bigint
+ outputColumnNames: _col0
+ File Output Operator
+ compressed: false
+ GlobalTableId: 0
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+
+PREHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table_desc1
+PREHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: query: select /*+ mapjoin(b) */ count(*) from table_desc1 a join table_desc2 b
+on a.key=b.key and a.value=b.value where a.key < 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table_desc1
+POSTHOOK: Input: default@table_desc2
+#### A masked pattern was here ####
+POSTHOOK: Lineage: table_desc1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: table_desc2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+22