private static List<ExprNodeDesc> createGroupByAggregationParameters(ReduceSinkOperator reduceOp) {
    List<ExprNodeDesc> params = new ArrayList<>();
    // There is a 1-1 mapping between columns and parameters for the aggregation functions min, max, bloom
    for (ColumnInfo c : reduceOp.getSchema().getSignature()) {
      String name = Utilities.ReduceField.VALUE + "." + c.getInternalName();
      params.add(new ExprNodeColumnDesc(new ColumnInfo(name, c.getType(), "", false)));
    }
    return params;
  }
Creates a group by operator with min, max, and bloomFilter aggregations for every column of the parent.
<p>
The method generates two kind of group by operators for intermediate and final aggregations respectively.
Intermediate aggregations require the parent operator to be a select operator while final aggregations assume that
the parent is a reduce sink operator.
</p>
<p>
Intermediate group by example.
<pre>
Input: SEL[fname, lname, age, hash(fname,lname,age)]
Output: GBY[min(fname),max(fname),min(lname),max(lname),min(age),max(age),bloom(hash)]
</pre>
</p>
<p>
Final group by example.
<pre>
Input: RS[fname_min,fname_max,lname_min,lname_max,age_min,age_max, hash_bloom]
Output: GBY[min(fname_min),max(fname_max),min(lname_min),max(lname_max),min(age_min),max(age_max),bloom(hash_bloom)]
</pre>
</p>
ql/src/java/org/apache/hadoop/hive/ql/optimizer/SemiJoinReductionMerge.java