/** * 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.plan; import java.util.Arrays; import java.util.List; import com.google.common.base.Strings; import org.apache.hadoop.hive.ql.plan.VectorPartitionDesc.VectorMapOperatorReadType; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; /** * VectorMapDesc. * * Extra vector information just for the PartitionDesc. * */ public class VectorPartitionDesc { private static final long serialVersionUID = 1L; // Data Type Conversion Needed? // // VECTORIZED_INPUT_FILE_FORMAT: // No data type conversion check? Assume ALTER TABLE prevented conversions that // VectorizedInputFileFormat cannot handle... // // VECTOR_DESERIALIZE: // LAZY_SIMPLE: // Capable of converting on its own. // LAZY_BINARY // Partition schema assumed to match file contents. // Conversion necessary from partition field values to vector columns. // ROW_DESERIALIZE // Partition schema assumed to match file contents. // Conversion necessary from partition field values to vector columns. // public static enum VectorMapOperatorReadType { NONE, VECTORIZED_INPUT_FILE_FORMAT, VECTOR_DESERIALIZE, ROW_DESERIALIZE } public static enum VectorDeserializeType { NONE, LAZY_SIMPLE, LAZY_BINARY } private VectorMapOperatorReadType vectorMapOperatorReadType; private final VectorDeserializeType vectorDeserializeType; private final String rowDeserializerClassName; private final String inputFileFormatClassName; boolean isInputFileFormatSelfDescribing; private TypeInfo[] dataTypeInfos; private VectorPartitionDesc(String inputFileFormatClassName, boolean isInputFileFormatSelfDescribing, VectorMapOperatorReadType vectorMapOperatorReadType) { this.vectorMapOperatorReadType = vectorMapOperatorReadType; this.vectorDeserializeType = VectorDeserializeType.NONE; this.inputFileFormatClassName = inputFileFormatClassName; rowDeserializerClassName = null; this.isInputFileFormatSelfDescribing = isInputFileFormatSelfDescribing; dataTypeInfos = null; } /** * Create a VECTOR_DESERIALIZE flavor object. * @param vectorMapOperatorReadType * @param vectorDeserializeType * @param needsDataTypeConversionCheck */ private VectorPartitionDesc(String inputFileFormatClassName, VectorDeserializeType vectorDeserializeType) { this.vectorMapOperatorReadType = VectorMapOperatorReadType.VECTOR_DESERIALIZE; this.vectorDeserializeType = vectorDeserializeType; this.inputFileFormatClassName = inputFileFormatClassName; rowDeserializerClassName = null; isInputFileFormatSelfDescribing = false; dataTypeInfos = null; } /** * Create a ROW_DESERIALIZE flavor object. * @param rowDeserializerClassName * @param inputFileFormatClassName */ private VectorPartitionDesc(String inputFileFormatClassName, boolean isInputFileFormatSelfDescribing, String rowDeserializerClassName) { this.vectorMapOperatorReadType = VectorMapOperatorReadType.ROW_DESERIALIZE; this.vectorDeserializeType = VectorDeserializeType.NONE; this.inputFileFormatClassName = inputFileFormatClassName; this.rowDeserializerClassName = rowDeserializerClassName; this.isInputFileFormatSelfDescribing = isInputFileFormatSelfDescribing; dataTypeInfos = null; } public static VectorPartitionDesc createVectorizedInputFileFormat(String inputFileFormatClassName, boolean isInputFileFormatSelfDescribing) { return new VectorPartitionDesc( inputFileFormatClassName, isInputFileFormatSelfDescribing, VectorMapOperatorReadType.VECTORIZED_INPUT_FILE_FORMAT); } public static VectorPartitionDesc createVectorDeserialize(String inputFileFormatClassName, VectorDeserializeType vectorDeserializeType) { return new VectorPartitionDesc(inputFileFormatClassName, vectorDeserializeType); } public static VectorPartitionDesc createRowDeserialize(String inputFileFormatClassName, boolean isInputFileFormatSelfDescribing, String rowDeserializerClassName) { return new VectorPartitionDesc(rowDeserializerClassName, isInputFileFormatSelfDescribing, inputFileFormatClassName); } @Override public VectorPartitionDesc clone() { VectorPartitionDesc result; switch (vectorMapOperatorReadType) { case VECTORIZED_INPUT_FILE_FORMAT: result = new VectorPartitionDesc(inputFileFormatClassName, isInputFileFormatSelfDescribing, vectorMapOperatorReadType); break; case VECTOR_DESERIALIZE: result = new VectorPartitionDesc(inputFileFormatClassName, vectorDeserializeType); break; case ROW_DESERIALIZE: result = new VectorPartitionDesc(inputFileFormatClassName, isInputFileFormatSelfDescribing, rowDeserializerClassName); break; default: throw new RuntimeException("Unexpected vector map operator read type " + vectorMapOperatorReadType.name()); } result.dataTypeInfos = Arrays.copyOf(dataTypeInfos, dataTypeInfos.length); return result; } @Override public boolean equals(Object o) { if (o instanceof VectorPartitionDesc) { VectorPartitionDesc other = (VectorPartitionDesc) o; return Strings.nullToEmpty(getInputFileFormatClassName()).equals( Strings.nullToEmpty(other.getInputFileFormatClassName())) && Strings.nullToEmpty(getRowDeserializerClassName()).equals( Strings.nullToEmpty(other.getRowDeserializerClassName())) && getVectorDeserializeType() == other.getVectorDeserializeType() && getVectorMapOperatorReadType() == other.getVectorMapOperatorReadType() && getIsInputFileFormatSelfDescribing() == other.getIsInputFileFormatSelfDescribing() && Arrays.equals(getDataTypeInfos(), other.getDataTypeInfos()); } return false; } @Override public int hashCode() { final int prime = 31; int result = 1; result = result * prime + (getInputFileFormatClassName() == null ? 0 : getInputFileFormatClassName().hashCode()); result = result * prime + (getRowDeserializerClassName() == null ? 0 : getRowDeserializerClassName().hashCode()); result = result * prime + (getVectorDeserializeType() == null ? 0 : getVectorDeserializeType().hashCode()); result = result * prime + (getVectorMapOperatorReadType() == null ? 0 : getVectorMapOperatorReadType().hashCode()); result = result * prime + Boolean.valueOf(getIsInputFileFormatSelfDescribing()).hashCode(); result = result * prime + Arrays.hashCode(getDataTypeInfos()); return result; } public VectorMapOperatorReadType getVectorMapOperatorReadType() { return vectorMapOperatorReadType; } public String getInputFileFormatClassName() { return inputFileFormatClassName; } public VectorDeserializeType getVectorDeserializeType() { return vectorDeserializeType; } public String getRowDeserializerClassName() { return rowDeserializerClassName; } public boolean getIsInputFileFormatSelfDescribing() { return isInputFileFormatSelfDescribing; } public TypeInfo[] getDataTypeInfos() { return dataTypeInfos; } public void setDataTypeInfos(List<TypeInfo> dataTypeInfoList) { dataTypeInfos = dataTypeInfoList.toArray(new TypeInfo[0]); } public int getDataColumnCount() { return dataTypeInfos.length; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("vector map operator read type "); sb.append(vectorMapOperatorReadType.name()); sb.append(", input file format class name "); sb.append(inputFileFormatClassName); switch (vectorMapOperatorReadType) { case VECTORIZED_INPUT_FILE_FORMAT: break; case VECTOR_DESERIALIZE: sb.append(", deserialize type "); sb.append(vectorDeserializeType.name()); break; case ROW_DESERIALIZE: sb.append(", deserializer class name "); sb.append(rowDeserializerClassName); break; default: throw new RuntimeException("Unexpected vector map operator read type " + vectorMapOperatorReadType.name()); } return sb.toString(); } public void setVectorMapOperatorReadType(VectorMapOperatorReadType val) { this.vectorMapOperatorReadType = val; } }