diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java index 2b3eab4..32ec1d7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java @@ -2016,6 +2016,17 @@ private boolean validateGroupByOperator(GroupByOperator op, boolean isReduce, bo return false; } + if (processingMode == ProcessingMode.MERGE_PARTIAL) { + // For now, VectorGroupByOperator ProcessingModeReduceMergePartial cannot handle key + // expressions. + for (ExprNodeDesc keyExpr : desc.getKeys()) { + if (!(keyExpr instanceof ExprNodeColumnDesc)) { + setExpressionIssue("Key", "Non-column key expressions not supported for MERGEPARTIAL"); + return false; + } + } + } + Pair retPair = validateAggregationDescs(desc.getAggregators(), processingMode, hasKeys); if (!retPair.left) { diff --git storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatch.java storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatch.java index 0235ffc..278865f 100644 --- storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatch.java +++ storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatch.java @@ -137,6 +137,43 @@ public String toString() { return ""; } StringBuilder b = new StringBuilder(); + b.append("Column vector types: "); + for (int k = 0; k < projectionSize; k++) { + int projIndex = projectedColumns[k]; + ColumnVector cv = cols[projIndex]; + if (k > 0) { + b.append(", "); + } + b.append(projIndex); + b.append(":"); + String colVectorType = null; + if (cv instanceof LongColumnVector) { + colVectorType = "LONG"; + } else if (cv instanceof DoubleColumnVector) { + colVectorType = "DOUBLE"; + } else if (cv instanceof BytesColumnVector) { + colVectorType = "BYTES"; + } else if (cv instanceof DecimalColumnVector) { + colVectorType = "DECIMAL"; + } else if (cv instanceof TimestampColumnVector) { + colVectorType = "TIMESTAMP"; + } else if (cv instanceof IntervalDayTimeColumnVector) { + colVectorType = "INTERVAL_DAY_TIME"; + } else if (cv instanceof ListColumnVector) { + colVectorType = "LIST"; + } else if (cv instanceof MapColumnVector) { + colVectorType = "MAP"; + } else if (cv instanceof StructColumnVector) { + colVectorType = "STRUCT"; + } else if (cv instanceof UnionColumnVector) { + colVectorType = "UNION"; + } else { + colVectorType = "Unknown"; + } + b.append(colVectorType); + } + b.append('\n'); + if (this.selectedInUse) { for (int j = 0; j < size; j++) { int i = selected[j]; diff --git storage-api/src/test/org/apache/hadoop/hive/ql/exec/vector/TestStructColumnVector.java storage-api/src/test/org/apache/hadoop/hive/ql/exec/vector/TestStructColumnVector.java index 9ac7ba0..c175ed0 100644 --- storage-api/src/test/org/apache/hadoop/hive/ql/exec/vector/TestStructColumnVector.java +++ storage-api/src/test/org/apache/hadoop/hive/ql/exec/vector/TestStructColumnVector.java @@ -116,7 +116,8 @@ public void testStringify() throws IOException { byte[] buffer = ("value " + r).getBytes(StandardCharsets.UTF_8); y.setRef(r, buffer, 0, buffer.length); } - final String EXPECTED = ("[[0, 2000-01-01 00:00:01.0], \"value 0\"]\n" + + final String EXPECTED = ("Column vector types: 0:STRUCT, 1:BYTES\n" + + "[[0, 2000-01-01 00:00:01.0], \"value 0\"]\n" + "[[3, 2000-01-01 00:00:02.0], \"value 1\"]\n" + "[[6, 2000-01-01 00:00:03.0], \"value 2\"]\n" + "[[9, 2000-01-01 00:00:04.0], \"value 3\"]\n" +