diff --git a/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt b/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt index 9f4bb75..8d429d3 100644 --- a/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt +++ b/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt @@ -24,6 +24,7 @@ import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil; import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor; +import org.apache.hadoop.hive.ql.exec.vector.expressions.ConditionalFilter; /** * Compute IF(expr1, expr2, expr3) for 3 input column expressions. @@ -54,7 +55,8 @@ public class extends VectorExpression { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt b/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt index 487d894..440f721 100644 --- a/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt +++ b/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt @@ -24,6 +24,7 @@ import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; import org.apache.hadoop.hive.ql.exec.vector.expressions.NullUtil; import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor; +import org.apache.hadoop.hive.ql.exec.vector.expressions.ConditionalFilter; /** * Compute IF(expr1, expr2, expr3) for 3 input column expressions. @@ -54,7 +55,8 @@ public class extends VectorExpression { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, -1, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConditionalFilter.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConditionalFilter.java new file mode 100644 index 0000000..67de4cb --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/ConditionalFilter.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.exec.vector.expressions; + +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; + +/** + * For conditional expressions, the{@code ConditionalFilter} class updated + * the selected array of batch parameter after the conditional expression is executed. + * Then the remaining expression will only do the selected rows instead of all. + */ +public class ConditionalFilter { + /* + * For If(expr1,expr2,expr3) expression, + * Firstly, save the previous selected vector, size and selectedInUse value of batch. + * Secondly evaluate the conditional expression and update the selected array of + * batch based on the result of conditional expression(1 denote done, 0 denote not done). + * Then evaluate the expr2 based on the updated selected. After the expr2 is executed, + * remove the indexes which have done in expr2. Last, evaluate the expr3 based on + * the updated selected. + */ + public static void evaluateIfChildren(VectorizedRowBatch batch, + VectorExpression[] childExpressions, int[] indexes) { + if (childExpressions != null) { + // Save the previous selected vector,size and selectedInUse value of batch. + int[] prevSelected = new int[batch.size]; + int prevSize = batch.size; + boolean prevSelectInUse = batch.selectedInUse; + + if (!batch.selectedInUse) { + for (int i = 0; i < prevSize; i++) { + prevSelected[i] = i; + } + System.arraycopy(prevSelected, 0, batch.selected, 0, prevSize); + } else { + System.arraycopy(batch.selected, 0, prevSelected, 0, batch.size); + } + + // Evaluate the conditional expression. + evaluateConditionalExpression(batch, childExpressions[0], prevSize, prevSelectInUse); + if (childExpressions.length == 2) { + // If the length is 2, it has two situations:If(expr1, expr2, null) or + // If(expr1, null, expr3) distinguished by the indexes. + if (childExpressions[1].getOutputColumn() == indexes[1]) { + // Evaluate the expr2 expression. + childExpressions[1].evaluate(batch); + } else { + // Update the selected array of batch to remove the index of being done. + evaluateSelectedArray(batch, indexes[0], prevSelected, prevSize); + // If(expr1, null, expr3), if the expr1 is false, expr3 will be evaluated. + childExpressions[1].evaluate(batch); + } + } else if (childExpressions.length == 3) { + // IF(expr1, expr2, expr3). expr1, expr2, expr3 are all the expression. + // Evaluate the expr2 expression. + childExpressions[1].evaluate(batch); + // Update the selected array of batch to remove the index of being done. + evaluateSelectedArray(batch, indexes[0], prevSelected, prevSize); + // Evaluate the expr3 expression. + childExpressions[2].evaluate(batch); + } + // When evaluate all the expressions, restore the previous selected vector, + // size and selectedInUse value of batch. + batch.size = prevSize; + batch.selectedInUse = prevSelectInUse; + batch.selected = prevSelected; + } + } + + /* + * Update the selected array of batch based on the conditional expression result, + * remove the index of being done. + */ + private static void evaluateSelectedArray(VectorizedRowBatch batch, int num, + int[] prevSelected, int size) { + // Get the result of conditional expression. + LongColumnVector outputColVector = (LongColumnVector) batch.cols[num]; + long[] flag = outputColVector.vector; + int newSize = 0; + // Update the selected array of batch. + for (int j = 0; j < size; j++) { + if (flag[prevSelected[j]] == 0) { + batch.selected[newSize++] = prevSelected[j]; + } + } + batch.size = newSize; + batch.selectedInUse = true; + } + + /* + * Evaluate the conditional expression and update the selected array of batch + * based on the result of conditional expression. + */ + private static void evaluateConditionalExpression(VectorizedRowBatch batch, VectorExpression ve, + int prevSize, boolean prevSelectInUse) { + batch.size = prevSize; + batch.selectedInUse = prevSelectInUse; + int colNum = ve.getOutputColumn(); + // Evaluate the conditional expression. + ve.evaluate(batch); + LongColumnVector outputColVector = (LongColumnVector) batch.cols[colNum]; + long[] flag = outputColVector.vector; + int[] sel = batch.selected; + int n = batch.size; + int newSize = 0; + // Update the selected array of the batch based on the conditional expression. + for (int j = 0; j < n; j++) { + int k = sel[j]; + if (flag[k] == 1) { + sel[newSize++] = k; + } + } + if (newSize < n) { + batch.size = newSize; + batch.selectedInUse = true; + } + } +} + diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java index 8cae274..d01cc32 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java @@ -40,9 +40,9 @@ public IfExprColumnNull(int arg1Column, int arg2Column, int outputColumn) { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column}); } - final LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; final ColumnVector arg2ColVector = batch.cols[arg2Column]; final ColumnVector outputColVector = batch.cols[outputColumn]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java index 514b453..b9b8025 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java @@ -48,7 +48,8 @@ public IfExprDoubleColumnDoubleColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java index 98fa29e..3abc5cd 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java @@ -48,7 +48,8 @@ public IfExprIntervalDayTimeColumnColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java index 9dc3669..33d4899 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java @@ -54,7 +54,8 @@ public IfExprIntervalDayTimeColumnScalar() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java index 4d4649f..e9d8ae7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java @@ -54,7 +54,8 @@ public IfExprIntervalDayTimeScalarColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, -1, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java index 4c6015e..92e5eee 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java @@ -47,7 +47,8 @@ public IfExprLongColumnLongColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java index 156fcc4..d690a83 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java @@ -40,7 +40,8 @@ public IfExprNullColumn(int arg1Column, int arg2Column, int outputColumn) { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column}); } final LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java index c8367c6..b493bad 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java @@ -51,7 +51,8 @@ public IfExprStringGroupColumnStringGroupColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java index 915c6d8..a2187bf 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java @@ -55,7 +55,8 @@ public IfExprStringGroupColumnStringScalar() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java index 11d51e3..09853be 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java @@ -55,7 +55,8 @@ public IfExprStringScalarStringGroupColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, -1, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java index 8219b3c..1fe6b12 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java @@ -47,7 +47,8 @@ public IfExprTimestampColumnColumnBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java index eb0c1c0..14fd3fe 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java @@ -56,7 +56,8 @@ public IfExprTimestampColumnScalarBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, this.arg2Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java index 3e4a195..baddf2c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java @@ -55,7 +55,8 @@ public IfExprTimestampScalarColumnBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + ConditionalFilter.evaluateIfChildren(batch, childExpressions, + new int[]{this.arg1Column, -1, this.arg3Column}); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java index 14ba646..ab62ac3 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java @@ -27,10 +27,7 @@ import org.apache.hadoop.hive.ql.exec.MapredContext; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.exec.vector.*; -import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriter; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriterFactory; +import org.apache.hadoop.hive.ql.exec.vector.expressions.*; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; @@ -125,7 +122,15 @@ public void evaluate(VectorizedRowBatch batch) { } if (childExpressions != null) { - super.evaluateChildren(batch); + if (("org.apache.hadoop.hive.ql.udf.generic.GenericUDFIf").equals(genericUDF.getUdfName())) { + int[] indexes = new int[argDescs.length]; + for (int i = 0; i < argDescs.length; i++) { + indexes[i] = argDescs[i].getColumnNum(); + } + ConditionalFilter.evaluateIfChildren(batch, childExpressions, indexes); + } else { + super.evaluateChildren(batch); + } } int[] sel = batch.selected; @@ -195,6 +200,18 @@ private boolean allInputColsRepeating(VectorizedRowBatch batch) { private void setResult(int i, VectorizedRowBatch b) { // get arguments + if (("org.apache.hadoop.hive.ql.udf.generic.GenericUDFIf").equals(genericUDF.getUdfName())) { + argDescs[0].flag[i][argDescs[0].getColumnNum()] = 1; + LongColumnVector outputColVector = (LongColumnVector) b.cols[argDescs[0].getColumnNum()]; + long[] flag = outputColVector.vector; + if (flag[i] == 0) { + argDescs[1].flag[i][argDescs[1].getColumnNum()] = -1; + argDescs[2].flag[i][argDescs[2].getColumnNum()] = 1; + } else { + argDescs[1].flag[i][argDescs[1].getColumnNum()] = 1; + argDescs[2].flag[i][argDescs[2].getColumnNum()] = -1; + } + } for (int j = 0; j < argDescs.length; j++) { deferredChildren[j] = argDescs[j].getDeferredJavaObject(i, b, j, writers); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFArgDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFArgDesc.java index e735bc1..32d6c9d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFArgDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFArgDesc.java @@ -43,6 +43,7 @@ private int columnNum; private transient GenericUDF.DeferredJavaObject constObjVal; private ExprNodeConstantDesc constExpr; + public int[][] flag =new int[VectorizedRowBatch.DEFAULT_SIZE][VectorizedRowBatch.DEFAULT_SIZE]; public VectorUDFArgDesc() { } @@ -120,7 +121,13 @@ public DeferredObject getDeferredJavaObject(int row, VectorizedRowBatch b, int a // write value to object that can be inspected Object o; try { - o = writers[argPosition].writeValue(cv, row); + // Here, -1 represent the value of position[row,column] will not + // be selected in GenericUDFIf expression. + if (flag[row][columnNum] == -1) { + o = null; + } else { + o = writers[argPosition].writeValue(cv, row); + } return new GenericUDF.DeferredJavaObject(o); } catch (HiveException e) { throw new RuntimeException("Unable to get Java object from VectorizedRowBatch", e);