/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed 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 hydrograph.engine.cascading.scheme.hive.parquet; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.serde2.io.DateWritable; import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.*; import java.math.BigDecimal; import java.math.RoundingMode; public enum WritableConverter { STRING { @Override public Object getValue(Writable writable) { return ((Text) writable).toString(); } }, BYTES { @Override public Object getValue(Writable writable) { return new String(((BytesWritable) writable).get()); } }, INTEGER { @Override public Object getValue(Writable writable) { return ((IntWritable) writable).get(); } }, DOUBLE { @Override public Object getValue(Writable writable) { return ((DoubleWritable) writable).get(); } }, DATE { @Override public Object getValue(Writable writable) { return ((DateWritable) writable).get().getTime(); } }, TIMESTAMP { @Override public Object getValue(Writable writable) { return ((TimestampWritable) writable).getTimestamp().getTime(); } }, DECIMAL { @Override public Object getValue(Writable writable) { // HiveDecimal object does not have method to get BigDecimal value. // So creating the BigDecimal object from double and setting the // same scale which HiveDecimal object has. HiveDecimal hiveDecimal = ((HiveDecimalWritable) writable) .getHiveDecimal(); return new BigDecimal(hiveDecimal.doubleValue()).setScale( hiveDecimal.scale(), RoundingMode.HALF_UP); } }, LONG { @Override public Object getValue(Writable writable) { return ((LongWritable) writable).get(); } }, BOOLEAN { @Override public Object getValue(Writable writable) { return ((BooleanWritable) writable).get(); } }, FLOAT { @Override public Object getValue(Writable writable) { return ((FloatWritable) writable).get(); } }; public abstract Object getValue(Writable writable); }