@Override
  public void initialize(Configuration configuration, Properties tableProperties, Properties partitionProperties)
      throws SerDeException {
    super.initialize(configuration, tableProperties, partitionProperties);

    serdeParams = new LazySerDeParameters(configuration, properties, getClass().getName());

    // Create the ObjectInspectors for the fields. Note: Currently
    // ColumnarObject uses same ObjectInspector as LazyStruct
    cachedObjectInspector = LazyFactory.createColumnarStructInspector(
        serdeParams.getColumnNames(), serdeParams.getColumnTypes(), serdeParams);

    int size = serdeParams.getColumnTypes().size();
    List<Integer> notSkipIDs = new ArrayList<Integer>();
    if (!this.configuration.isPresent() || ColumnProjectionUtils.isReadAllColumns(this.configuration.get())) {
      for (int i = 0; i < size; i++) {
        notSkipIDs.add(i);
      }
    } else {
      notSkipIDs = ColumnProjectionUtils.getReadColumnIDs(this.configuration.get());
    }
    cachedLazyStruct = new ColumnarStruct(
        cachedObjectInspector, notSkipIDs, serdeParams.getNullSequence());

    super.initialize(size);
  }
ColumnarSerDe is used for columnar based storage supported by RCFile.
ColumnarSerDe differentiate from LazySimpleSerDe in:<br>
(1) ColumnarSerDe uses a ColumnarStruct as its lazy Object <br>
(2) ColumnarSerDe initialize ColumnarStruct's field directly. But under the
field level, it works like LazySimpleSerDe<br>
serde/src/java/org/apache/hadoop/hive/serde2/columnar/ColumnarSerDe.java