public static ExprNodeColumnDesc getColumnExpr(ExprNodeDesc expr) {
    while (FunctionRegistry.isOpCast(expr)) {
      expr = expr.getChildren().get(0);
    }
    return (expr instanceof ExprNodeColumnDesc) ? (ExprNodeColumnDesc)expr : null;
  }
A normal reduce operator's rowObjectInspector looks like a struct containing
 nested key/value structs that contain the column values:
 { key: { reducesinkkey0:int }, value: { _col0:int, _col1:int, .. } }

While the rowObjectInspector looks the same for vectorized queries during
compilation time, within the tasks at query execution the rowObjectInspector
has changed to a flatter structure without nested key/value structs:
 { 'key.reducesinkkey0':int, 'value._col0':int, 'value._col1':int, .. }

Trying to fetch 'key.reducesinkkey0' by name from the list of flattened
ObjectInspectors does not work because the '.' gets interpreted as a field member,
even though it is a flattened list of column values.
This workaround converts the column name referenced in the ExprNodeDesc
from a nested field name (key.reducesinkkey0) to key_reducesinkkey0,
simply by replacing '.' with '_'.
@param source
@return
ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java