diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/api/impl/LlapInputFormat.java llap-server/src/java/org/apache/hadoop/hive/llap/io/api/impl/LlapInputFormat.java index d3dd4d1..85890d4 100644 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/api/impl/LlapInputFormat.java +++ llap-server/src/java/org/apache/hadoop/hive/llap/io/api/impl/LlapInputFormat.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.util.LinkedList; import java.util.List; -import java.util.Random; import org.apache.hadoop.hive.llap.Consumer; import org.apache.hadoop.hive.llap.ConsumerFeedback; @@ -150,14 +149,14 @@ public boolean next(NullWritable key, VectorizedRowBatch value) throws IOExcepti throw new IOException(e); } if (cvb == null) return false; - int[] columnMap = rbCtx.getIncludedColumnIndexes(); - if (columnMap.length != cvb.cols.length) { - throw new RuntimeException("Unexpected number of columns, VRB has " + columnMap.length + if (columnIds.size() != cvb.cols.length) { + throw new RuntimeException("Unexpected number of columns, VRB has " + columnIds.size() + " included, but the reader returned " + cvb.cols.length); } // VRB was created from VrbCtx, so we already have pre-allocated column vectors for (int i = 0; i < cvb.cols.length; ++i) { - value.cols[columnMap[i]] = cvb.cols[i]; // TODO: reuse CV objects that are replaced + int columnId = columnIds.get(i); + value.cols[columnId] = cvb.cols[i]; // TODO: reuse CV objects that are replaced } value.selectedInUse = false; value.size = cvb.size; diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/OrcEncodedDataConsumer.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/OrcEncodedDataConsumer.java index 971103d..b712075 100644 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/OrcEncodedDataConsumer.java +++ llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/OrcEncodedDataConsumer.java @@ -24,32 +24,20 @@ import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; import org.apache.hadoop.hive.llap.io.api.impl.ColumnVectorBatch; import org.apache.hadoop.hive.llap.io.api.orc.OrcBatchKey; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.BinaryStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.BooleanStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.ByteStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.CharacterStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.DateStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.DecimalStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.DoubleStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.FloatStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.IntStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.LongStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.ShortStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.StringStreamReader; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.readers.TimestampStreamReader; import org.apache.hadoop.hive.llap.io.metadata.OrcFileMetadata; import org.apache.hadoop.hive.llap.io.metadata.OrcStripeMetadata; import org.apache.hadoop.hive.llap.metrics.LlapDaemonQueueMetrics; import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; +import org.apache.hadoop.hive.ql.io.orc.EncodedRecordReaderImplFactory; import org.apache.hadoop.hive.ql.io.orc.OrcProto; import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; +import org.apache.hadoop.hive.ql.io.orc.RecordReaderImplFactory; import org.apache.hadoop.hive.ql.io.orc.WriterImpl; public class OrcEncodedDataConsumer extends EncodedDataConsumer { - private RecordReaderImpl.TreeReader[] columnReaders; + private RecordReaderImplFactory.TreeReader[] columnReaders; private int previousStripeIndex = -1; private OrcFileMetadata fileMetadata; // We assume one request is only for one file. private CompressionCodec codec; @@ -95,10 +83,10 @@ protected void decodeBatch(EncodedColumnBatch batch, int batchSize = VectorizedRowBatch.DEFAULT_SIZE; int numCols = batch.columnIxs.length; if (columnReaders == null || !sameStripe) { - this.columnReaders = createTreeReaders(numCols, batch, codec, fileMetadata, stripeMetadata); + this.columnReaders = EncodedRecordReaderImplFactory.createEncodedTreeReader(numCols, + fileMetadata.getTypes(), stripeMetadata.getEncodings(), batch, codec, skipCorrupt); } else { - repositionInStreams(this.columnReaders, batch, sameStripe, numCols, fileMetadata, - stripeMetadata); + repositionInStreams(this.columnReaders, batch, sameStripe, numCols, stripeMetadata); } previousStripeIndex = currentStripeIndex; @@ -128,304 +116,17 @@ protected void decodeBatch(EncodedColumnBatch batch, } } - RecordReaderImpl.TreeReader[] createTreeReaders(int numCols, - EncodedColumnBatch batch, - CompressionCodec codec, - OrcFileMetadata fileMetadata, - OrcStripeMetadata stripeMetadata) throws IOException { - long file = batch.batchKey.file; - RecordReaderImpl.TreeReader[] treeReaders = new RecordReaderImpl.TreeReader[numCols]; - - for (int i = 0; i < numCols; i++) { - int columnIndex = batch.columnIxs[i]; - int rowGroupIndex = batch.batchKey.rgIx; - EncodedColumnBatch.StreamBuffer[] streamBuffers = batch.columnData[i]; - OrcProto.Type columnType = fileMetadata.getTypes().get(columnIndex); - - // EncodedColumnBatch is already decompressed, we don't really need to pass codec. - // But we need to know if the original data is compressed or not. This is used to skip - // positions in row index properly. If the file is originally compressed, - // then 1st position (compressed offset) in row index should be skipped to get - // uncompressed offset, else 1st position should not be skipped. - // TODO: there should be a better way to do this, code just needs to be modified - OrcProto.ColumnEncoding columnEncoding = stripeMetadata.getEncodings().get(columnIndex); - OrcProto.RowIndex rowIndex = stripeMetadata.getRowIndexes()[columnIndex]; - OrcProto.RowIndexEntry rowIndexEntry = rowIndex.getEntry(rowGroupIndex); - - // stream buffers are arranged in enum order of stream kind - EncodedColumnBatch.StreamBuffer present = null; - EncodedColumnBatch.StreamBuffer data = null; - EncodedColumnBatch.StreamBuffer dictionary = null; - EncodedColumnBatch.StreamBuffer lengths = null; - EncodedColumnBatch.StreamBuffer secondary = null; - for (EncodedColumnBatch.StreamBuffer streamBuffer : streamBuffers) { - switch(streamBuffer.streamKind) { - case 0: - // PRESENT stream - present = streamBuffer; - break; - case 1: - // DATA stream - data = streamBuffer; - break; - case 2: - // LENGTH stream - lengths = streamBuffer; - break; - case 3: - // DICTIONARY_DATA stream - dictionary = streamBuffer; - break; - case 5: - // SECONDARY stream - secondary = streamBuffer; - break; - default: - throw new IOException("Unexpected stream kind: " + streamBuffer.streamKind); - } - } - - switch (columnType.getKind()) { - case BINARY: - treeReaders[i] = BinaryStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setLengthStream(lengths) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - case BOOLEAN: - treeReaders[i] = BooleanStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .build(); - break; - case BYTE: - treeReaders[i] = ByteStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .build(); - break; - case SHORT: - treeReaders[i] = ShortStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - case INT: - treeReaders[i] = IntStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - case LONG: - treeReaders[i] = LongStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .skipCorrupt(skipCorrupt) - .build(); - break; - case FLOAT: - treeReaders[i] = FloatStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .build(); - break; - case DOUBLE: - treeReaders[i] = DoubleStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .build(); - break; - case CHAR: - case VARCHAR: - treeReaders[i] = CharacterStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setMaxLength(columnType.getMaximumLength()) - .setCharacterType(columnType) - .setPresentStream(present) - .setDataStream(data) - .setLengthStream(lengths) - .setDictionaryStream(dictionary) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - case STRING: - treeReaders[i] = StringStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setLengthStream(lengths) - .setDictionaryStream(dictionary) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - case DECIMAL: - treeReaders[i] = DecimalStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPrecision(columnType.getPrecision()) - .setScale(columnType.getScale()) - .setPresentStream(present) - .setValueStream(data) - .setScaleStream(secondary) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - case TIMESTAMP: - treeReaders[i] = TimestampStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setSecondsStream(data) - .setNanosStream(secondary) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .skipCorrupt(skipCorrupt) - .build(); - break; - case DATE: - treeReaders[i] = DateStreamReader.builder() - .setFileId(file) - .setColumnIndex(columnIndex) - .setPresentStream(present) - .setDataStream(data) - .setCompressionCodec(codec) - .setColumnEncoding(columnEncoding) - .build(); - break; - default: - throw new UnsupportedOperationException("Data type not supported yet! " + columnType); - } - treeReaders[i].seek(StreamUtils.getPositionProvider(rowIndexEntry)); - } - return treeReaders; - } - - private void repositionInStreams(RecordReaderImpl.TreeReader[] columnReaders, + private void repositionInStreams(RecordReaderImplFactory.TreeReader[] columnReaders, EncodedColumnBatch batch, boolean sameStripe, int numCols, - OrcFileMetadata fileMetadata, OrcStripeMetadata stripeMetadata) throws IOException { + OrcStripeMetadata stripeMetadata) throws IOException { for (int i = 0; i < numCols; i++) { int columnIndex = batch.columnIxs[i]; int rowGroupIndex = batch.batchKey.rgIx; EncodedColumnBatch.StreamBuffer[] streamBuffers = batch.columnData[i]; - OrcProto.Type columnType = fileMetadata.getTypes().get(columnIndex); OrcProto.RowIndex rowIndex = stripeMetadata.getRowIndexes()[columnIndex]; OrcProto.RowIndexEntry rowIndexEntry = rowIndex.getEntry(rowGroupIndex); - - // stream buffers are arranged in enum order of stream kind - EncodedColumnBatch.StreamBuffer present = null; - EncodedColumnBatch.StreamBuffer data = null; - EncodedColumnBatch.StreamBuffer dictionary = null; - EncodedColumnBatch.StreamBuffer lengths = null; - EncodedColumnBatch.StreamBuffer secondary = null; - for (EncodedColumnBatch.StreamBuffer streamBuffer : streamBuffers) { - switch(streamBuffer.streamKind) { - case 0: - // PRESENT stream - present = streamBuffer; - break; - case 1: - // DATA stream - data = streamBuffer; - break; - case 2: - // LENGTH stream - lengths = streamBuffer; - break; - case 3: - // DICTIONARY_DATA stream - dictionary = streamBuffer; - break; - case 5: - // SECONDARY stream - secondary = streamBuffer; - break; - default: - throw new IOException("Unexpected stream kind: " + streamBuffer.streamKind); - } - } - - switch (columnType.getKind()) { - case BINARY: - ((BinaryStreamReader)columnReaders[i]).setBuffers(present, data, lengths); - break; - case BOOLEAN: - ((BooleanStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case BYTE: - ((ByteStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case SHORT: - ((ShortStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case INT: - ((IntStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case LONG: - ((LongStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case FLOAT: - ((FloatStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case DOUBLE: - ((DoubleStreamReader)columnReaders[i]).setBuffers(present, data); - break; - case CHAR: - case VARCHAR: - ((CharacterStreamReader)columnReaders[i]).setBuffers(present, data, lengths, dictionary, - sameStripe); - break; - case STRING: - ((StringStreamReader)columnReaders[i]).setBuffers(present, data, lengths, dictionary, - sameStripe); - break; - case DECIMAL: - ((DecimalStreamReader)columnReaders[i]).setBuffers(present, data, secondary); - break; - case TIMESTAMP: - ((TimestampStreamReader)columnReaders[i]).setBuffers(present, data, secondary); - break; - case DATE: - ((DateStreamReader)columnReaders[i]).setBuffers(present, data); - break; - default: - throw new UnsupportedOperationException("Data type not supported yet! " + columnType); - } - - columnReaders[i].seek(StreamUtils.getPositionProvider(rowIndexEntry)); + columnReaders[i].setBuffers(streamBuffers, sameStripe); + columnReaders[i].seek(new RecordReaderImpl.PositionProviderImpl(rowIndexEntry)); } } diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/SettableUncompressedStream.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/SettableUncompressedStream.java deleted file mode 100644 index 8e6e10e..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/SettableUncompressedStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream; - -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.ql.io.orc.InStream; - -public class SettableUncompressedStream extends InStream.UncompressedStream { - - public SettableUncompressedStream(Long fileId, String name, - List input, long length) { - super(fileId, name, input, length); - } - - public void setBuffers(List input, long length) { - reset(input, length); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/StreamUtils.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/StreamUtils.java deleted file mode 100644 index 69fb788..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/StreamUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.api.cache.LlapMemoryBuffer; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream utility. - */ -public class StreamUtils { - - /** - * Create LlapInStream from stream buffer. - * - * @param streamName - stream name - * @param fileName - file name - * @param streamBuffer - stream buffer - * @return - LlapInStream - * @throws IOException - */ - public static SettableUncompressedStream createLlapInStream(String streamName, Long fileId, - EncodedColumnBatch.StreamBuffer streamBuffer) throws IOException { - if (streamBuffer == null) { - return null; - } - - List diskRanges = Lists.newArrayList(); - long totalLength = createDiskRanges(streamBuffer, diskRanges); - return new SettableUncompressedStream(fileId, streamName, diskRanges, totalLength); - } - - /** - * Converts row index entry to position provider. - * - * @param rowIndex - row index entry - * @return - position provider - */ - public static PositionProvider getPositionProvider(OrcProto.RowIndexEntry rowIndex) { - PositionProvider positionProvider = new RecordReaderImpl.PositionProviderImpl(rowIndex); - return positionProvider; - } - - /** - * Converts stream buffers to disk ranges. - * @param streamBuffer - stream buffer - * @param diskRanges - initial empty list of disk ranges - * @return - total length of disk ranges - */ - // TODO: unnecessary - public static long createDiskRanges(EncodedColumnBatch.StreamBuffer streamBuffer, - List diskRanges) { - long totalLength = 0; - for (LlapMemoryBuffer memoryBuffer : streamBuffer.cacheBuffers) { - ByteBuffer buffer = memoryBuffer.getByteBufferDup(); - RecordReaderImpl.BufferChunk bufferChunk = new RecordReaderImpl.BufferChunk(buffer, - totalLength); - diskRanges.add(bufferChunk); - totalLength += buffer.remaining(); - } - return totalLength; - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/BinaryStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/BinaryStreamReader.java deleted file mode 100644 index 6cd6e7b..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/BinaryStreamReader.java +++ /dev/null @@ -1,164 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - - -/** - * Stream reader for binary column type. - */ -public class BinaryStreamReader extends RecordReaderImpl.BinaryTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - private SettableUncompressedStream _lengthsStream; - - private BinaryStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, SettableUncompressedStream length, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, length, encoding); - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - this._lengthsStream = length; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - stream.seek(index); - } - - if (lengths != null && _lengthsStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - lengths.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer, - EncodedColumnBatch.StreamBuffer lengthStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - if (_lengthsStream != null) { - List lengthDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(lengthStreamBuffer, lengthDiskRanges); - _lengthsStream.setBuffers(lengthDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private EncodedColumnBatch.StreamBuffer lengthStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer secondaryStream) { - this.lengthStream = secondaryStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public BinaryStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.PRESENT.name(), fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.DATA.name(), fileId, dataStream); - - SettableUncompressedStream length = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.LENGTH.name(), fileId, lengthStream); - - boolean isFileCompressed = compressionCodec != null; - return new BinaryStreamReader(columnIndex, present, data, length, isFileCompressed, - columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/BooleanStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/BooleanStreamReader.java deleted file mode 100644 index af61ead..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/BooleanStreamReader.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for boolean column type. - */ -public class BooleanStreamReader extends RecordReaderImpl.BooleanTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private BooleanStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed) throws IOException { - super(columnId, present, data); - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - reader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public BooleanStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new BooleanStreamReader(columnIndex, present, data, isFileCompressed); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/ByteStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/ByteStreamReader.java deleted file mode 100644 index ed4199c..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/ByteStreamReader.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for byte column type. - */ -public class ByteStreamReader extends RecordReaderImpl.ByteTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private ByteStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed) throws IOException { - super(columnId, present, data); - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - reader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public ByteStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new ByteStreamReader(columnIndex, present, data, isFileCompressed); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/CharacterStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/CharacterStreamReader.java deleted file mode 100644 index b95bf9b..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/CharacterStreamReader.java +++ /dev/null @@ -1,231 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for char and varchar column types. - */ -public class CharacterStreamReader extends RecordReaderImpl.StringTreeReader { - private boolean _isFileCompressed; - private boolean _isDictionaryEncoding; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - private SettableUncompressedStream _lengthStream; - private SettableUncompressedStream _dictionaryStream; - - private CharacterStreamReader(int columnId, int maxLength, OrcProto.Type charType, - SettableUncompressedStream present, SettableUncompressedStream data, SettableUncompressedStream length, SettableUncompressedStream dictionary, - boolean isFileCompressed, OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId); - this._isDictionaryEncoding = dictionary != null; - if (charType.getKind() == OrcProto.Type.Kind.CHAR) { - reader = new RecordReaderImpl.CharTreeReader(columnId, maxLength, present, data, length, - dictionary, encoding); - } else if (charType.getKind() == OrcProto.Type.Kind.VARCHAR) { - reader = new RecordReaderImpl.VarcharTreeReader(columnId, maxLength, present, data, - length, dictionary, encoding); - } else { - throw new IOException("Unknown character type " + charType + ". Expected CHAR or VARCHAR."); - } - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - this._lengthStream = length; - this._dictionaryStream = dictionary; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - reader.present.seek(index); - } - - if (_isDictionaryEncoding) { - // DICTIONARY encoding - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - ((RecordReaderImpl.StringDictionaryTreeReader) reader).reader.seek(index); - } - } else { - // DIRECT encoding - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - ((RecordReaderImpl.StringDirectTreeReader) reader).stream.seek(index); - } - - if (_lengthStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - ((RecordReaderImpl.StringDirectTreeReader) reader).lengths.seek(index); - } - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer, - EncodedColumnBatch.StreamBuffer lengthStreamBuffer, - EncodedColumnBatch.StreamBuffer dictionaryStreamBuffer, - boolean sameStripe) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - if (!_isDictionaryEncoding) { - if (_lengthStream != null) { - List lengthDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(lengthStreamBuffer, lengthDiskRanges); - _lengthStream.setBuffers(lengthDiskRanges, length); - } - } - - // set these streams only if the stripe is different - if (!sameStripe && _isDictionaryEncoding) { - if (_lengthStream != null) { - List lengthDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(lengthStreamBuffer, lengthDiskRanges); - _lengthStream.setBuffers(lengthDiskRanges, length); - } - if (_dictionaryStream != null) { - List dictionaryDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dictionaryStreamBuffer, dictionaryDiskRanges); - _dictionaryStream.setBuffers(dictionaryDiskRanges, length); - } - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private int maxLength; - private OrcProto.Type charType; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private EncodedColumnBatch.StreamBuffer dictionaryStream; - private EncodedColumnBatch.StreamBuffer lengthStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setMaxLength(int maxLength) { - this.maxLength = maxLength; - return this; - } - - public StreamReaderBuilder setCharacterType(OrcProto.Type charType) { - this.charType = charType; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer lengthStream) { - this.lengthStream = lengthStream; - return this; - } - - public StreamReaderBuilder setDictionaryStream(EncodedColumnBatch.StreamBuffer dictStream) { - this.dictionaryStream = dictStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public CharacterStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - SettableUncompressedStream length = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.LENGTH.name(), fileId, - lengthStream); - - SettableUncompressedStream dictionary = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.DICTIONARY_DATA.name(), fileId, dictionaryStream); - - boolean isFileCompressed = compressionCodec != null; - return new CharacterStreamReader(columnIndex, maxLength, charType, present, data, length, - dictionary, isFileCompressed, columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } - -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DateStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DateStreamReader.java deleted file mode 100644 index cf08654..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DateStreamReader.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for date column type. - */ -public class DateStreamReader extends RecordReaderImpl.DateTreeReader { - private boolean isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private DateStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, encoding); - this.isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (isFileCompressed) { - index.getNext(); - } - reader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public DateStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new DateStreamReader(columnIndex, present, data, isFileCompressed, - columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DecimalStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DecimalStreamReader.java deleted file mode 100644 index 9812378..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DecimalStreamReader.java +++ /dev/null @@ -1,175 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for decimal column type. - */ -public class DecimalStreamReader extends RecordReaderImpl.DecimalTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _valueStream; - private SettableUncompressedStream _scaleStream; - - private DecimalStreamReader(int columnId, int precision, int scale, SettableUncompressedStream presentStream, - SettableUncompressedStream valueStream, SettableUncompressedStream scaleStream, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, precision, scale, presentStream, valueStream, scaleStream, encoding); - this._isFileCompressed = isFileCompressed; - this._presentStream = presentStream; - this._valueStream = valueStream; - this._scaleStream = scaleStream; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_valueStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - valueStream.seek(index); - } - - if (_scaleStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - scaleReader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer valueStreamBuffer, - EncodedColumnBatch.StreamBuffer scaleStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_valueStream != null) { - List valueDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(valueStreamBuffer, valueDiskRanges); - _valueStream.setBuffers(valueDiskRanges, length); - } - if (_scaleStream != null) { - List scaleDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(scaleStreamBuffer, scaleDiskRanges); - _scaleStream.setBuffers(scaleDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer valueStream; - private EncodedColumnBatch.StreamBuffer scaleStream; - private int scale; - private int precision; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPrecision(int precision) { - this.precision = precision; - return this; - } - - public StreamReaderBuilder setScale(int scale) { - this.scale = scale; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setValueStream(EncodedColumnBatch.StreamBuffer valueStream) { - this.valueStream = valueStream; - return this; - } - - public StreamReaderBuilder setScaleStream(EncodedColumnBatch.StreamBuffer scaleStream) { - this.scaleStream = scaleStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public DecimalStreamReader build() throws IOException { - SettableUncompressedStream presentInStream = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.PRESENT.name(), fileId, presentStream); - - SettableUncompressedStream valueInStream = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.DATA.name(), fileId, valueStream); - - SettableUncompressedStream scaleInStream = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.SECONDARY.name(), fileId, scaleStream); - - boolean isFileCompressed = compressionCodec != null; - return new DecimalStreamReader(columnIndex, precision, scale, presentInStream, valueInStream, - scaleInStream, isFileCompressed, columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DoubleStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DoubleStreamReader.java deleted file mode 100644 index 9c441aa..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/DoubleStreamReader.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for double column type. - */ -public class DoubleStreamReader extends RecordReaderImpl.DoubleTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private DoubleStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed) throws IOException { - super(columnId, present, data); - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - stream.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public DoubleStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new DoubleStreamReader(columnIndex, present, data, isFileCompressed); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/FloatStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/FloatStreamReader.java deleted file mode 100644 index f1f0e8f..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/FloatStreamReader.java +++ /dev/null @@ -1,132 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for float column type. - */ -public class FloatStreamReader extends RecordReaderImpl.FloatTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private FloatStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed) throws IOException { - super(columnId, present, data); - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - stream.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public FloatStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new FloatStreamReader(columnIndex, present, data, isFileCompressed); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } - -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/IntStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/IntStreamReader.java deleted file mode 100644 index c113b23..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/IntStreamReader.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - - -/** - * Stream reader for integer column type. - */ -public class IntStreamReader extends RecordReaderImpl.IntTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private IntStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, encoding); - this._isFileCompressed = isFileCompressed; - this._dataStream = data; - this._presentStream = present; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - reader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public IntStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new IntStreamReader(columnIndex, present, data, isFileCompressed, - columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } - -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/LongStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/LongStreamReader.java deleted file mode 100644 index 7faeeee..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/LongStreamReader.java +++ /dev/null @@ -1,145 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for long column type. - */ -public class LongStreamReader extends RecordReaderImpl.LongTreeReader { - private boolean _isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private LongStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding, boolean skipCorrupt) throws IOException { - super(columnId, present, data, encoding, skipCorrupt); - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - reader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - private boolean skipCorrupt; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public StreamReaderBuilder skipCorrupt(boolean skipCorrupt) { - this.skipCorrupt = skipCorrupt; - return this; - } - - public LongStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new LongStreamReader(columnIndex, present, data, isFileCompressed, - columnEncoding, skipCorrupt); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/ShortStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/ShortStreamReader.java deleted file mode 100644 index 8f5afbd..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/ShortStreamReader.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for short column type. - */ -public class ShortStreamReader extends RecordReaderImpl.ShortTreeReader { - private boolean isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - - private ShortStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, encoding); - this.isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (isFileCompressed) { - index.getNext(); - } - reader.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public ShortStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - boolean isFileCompressed = compressionCodec != null; - return new ShortStreamReader(columnIndex, present, data, isFileCompressed, - columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/StringStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/StringStreamReader.java deleted file mode 100644 index 54914bc..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/StringStreamReader.java +++ /dev/null @@ -1,210 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for string column type. - */ -public class StringStreamReader extends RecordReaderImpl.StringTreeReader { - private boolean _isFileCompressed; - private boolean _isDictionaryEncoding; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _dataStream; - private SettableUncompressedStream _lengthStream; - private SettableUncompressedStream _dictionaryStream; - - private StringStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, SettableUncompressedStream length, SettableUncompressedStream dictionary, - boolean isFileCompressed, OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, length, dictionary, encoding); - this._isDictionaryEncoding = dictionary != null; - this._isFileCompressed = isFileCompressed; - this._presentStream = present; - this._dataStream = data; - this._lengthStream = length; - this._dictionaryStream = dictionary; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (_isFileCompressed) { - index.getNext(); - } - reader.present.seek(index); - } - - if (_isDictionaryEncoding) { - // DICTIONARY encoding - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - ((RecordReaderImpl.StringDictionaryTreeReader) reader).reader.seek(index); - } - } else { - // DIRECT encoding - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_dataStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - ((RecordReaderImpl.StringDirectTreeReader) reader).stream.seek(index); - } - - if (_lengthStream.available() > 0) { - if (_isFileCompressed) { - index.getNext(); - } - ((RecordReaderImpl.StringDirectTreeReader) reader).lengths.seek(index); - } - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer dataStreamBuffer, - EncodedColumnBatch.StreamBuffer lengthStreamBuffer, - EncodedColumnBatch.StreamBuffer dictionaryStreamBuffer, - boolean sameStripe) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_dataStream != null) { - List dataDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); - _dataStream.setBuffers(dataDiskRanges, length); - } - if (!_isDictionaryEncoding) { - if (_lengthStream != null) { - List lengthDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(lengthStreamBuffer, lengthDiskRanges); - _lengthStream.setBuffers(lengthDiskRanges, length); - } - } - - // set these streams only if the stripe is different - if (!sameStripe && _isDictionaryEncoding) { - if (_lengthStream != null) { - List lengthDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(lengthStreamBuffer, lengthDiskRanges); - _lengthStream.setBuffers(lengthDiskRanges, length); - } - if (_dictionaryStream != null) { - List dictionaryDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(dictionaryStreamBuffer, dictionaryDiskRanges); - _dictionaryStream.setBuffers(dictionaryDiskRanges, length); - } - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private EncodedColumnBatch.StreamBuffer dictionaryStream; - private EncodedColumnBatch.StreamBuffer lengthStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer lengthStream) { - this.lengthStream = lengthStream; - return this; - } - - public StreamReaderBuilder setDictionaryStream(EncodedColumnBatch.StreamBuffer dictStream) { - this.dictionaryStream = dictStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public StringStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - SettableUncompressedStream length = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.LENGTH.name(), fileId, - lengthStream); - - SettableUncompressedStream dictionary = StreamUtils.createLlapInStream( - OrcProto.Stream.Kind.DICTIONARY_DATA.name(), fileId, dictionaryStream); - - boolean isFileCompressed = compressionCodec != null; - return new StringStreamReader(columnIndex, present, data, length, dictionary, - isFileCompressed, columnEncoding); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } - -} diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/TimestampStreamReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/TimestampStreamReader.java deleted file mode 100644 index 97c5cf5..0000000 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/decode/orc/stream/readers/TimestampStreamReader.java +++ /dev/null @@ -1,169 +0,0 @@ -/** - * 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.llap.io.decode.orc.stream.readers; - -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hive.common.DiskRange; -import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.SettableUncompressedStream; -import org.apache.hadoop.hive.llap.io.decode.orc.stream.StreamUtils; -import org.apache.hadoop.hive.ql.io.orc.CompressionCodec; -import org.apache.hadoop.hive.ql.io.orc.OrcProto; -import org.apache.hadoop.hive.ql.io.orc.PositionProvider; -import org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl; - -import com.google.common.collect.Lists; - -/** - * Stream reader for timestamp column type. - */ -public class TimestampStreamReader extends RecordReaderImpl.TimestampTreeReader { - private boolean isFileCompressed; - private SettableUncompressedStream _presentStream; - private SettableUncompressedStream _secondsStream; - private SettableUncompressedStream _nanosStream; - - private TimestampStreamReader(int columnId, SettableUncompressedStream present, - SettableUncompressedStream data, SettableUncompressedStream nanos, boolean isFileCompressed, - OrcProto.ColumnEncoding encoding, boolean skipCorrupt) throws IOException { - super(columnId, present, data, nanos, encoding, skipCorrupt); - this.isFileCompressed = isFileCompressed; - this._presentStream = present; - this._secondsStream = data; - this._nanosStream = nanos; - } - - @Override - public void seek(PositionProvider index) throws IOException { - if (present != null) { - if (isFileCompressed) { - index.getNext(); - } - present.seek(index); - } - - // data stream could be empty stream or already reached end of stream before present stream. - // This can happen if all values in stream are nulls or last row group values are all null. - if (_secondsStream.available() > 0) { - if (isFileCompressed) { - index.getNext(); - } - data.seek(index); - } - - if (_nanosStream.available() > 0) { - if (isFileCompressed) { - index.getNext(); - } - nanos.seek(index); - } - } - - public void setBuffers(EncodedColumnBatch.StreamBuffer presentStreamBuffer, - EncodedColumnBatch.StreamBuffer secondsStream, - EncodedColumnBatch.StreamBuffer nanosStream) { - long length; - if (_presentStream != null) { - List presentDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); - _presentStream.setBuffers(presentDiskRanges, length); - } - if (_secondsStream != null) { - List secondsDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(secondsStream, secondsDiskRanges); - _secondsStream.setBuffers(secondsDiskRanges, length); - } - if (_nanosStream != null) { - List nanosDiskRanges = Lists.newArrayList(); - length = StreamUtils.createDiskRanges(nanosStream, nanosDiskRanges); - _nanosStream.setBuffers(nanosDiskRanges, length); - } - } - - public static class StreamReaderBuilder { - private Long fileId; - private int columnIndex; - private EncodedColumnBatch.StreamBuffer presentStream; - private EncodedColumnBatch.StreamBuffer dataStream; - private EncodedColumnBatch.StreamBuffer nanosStream; - private CompressionCodec compressionCodec; - private OrcProto.ColumnEncoding columnEncoding; - private boolean skipCorrupt; - - public StreamReaderBuilder setFileId(Long fileId) { - this.fileId = fileId; - return this; - } - - public StreamReaderBuilder setColumnIndex(int columnIndex) { - this.columnIndex = columnIndex; - return this; - } - - public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { - this.presentStream = presentStream; - return this; - } - - public StreamReaderBuilder setSecondsStream(EncodedColumnBatch.StreamBuffer dataStream) { - this.dataStream = dataStream; - return this; - } - - public StreamReaderBuilder setNanosStream(EncodedColumnBatch.StreamBuffer secondaryStream) { - this.nanosStream = secondaryStream; - return this; - } - - public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { - this.compressionCodec = compressionCodec; - return this; - } - - public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { - this.columnEncoding = encoding; - return this; - } - - public StreamReaderBuilder skipCorrupt(boolean skipCorrupt) { - this.skipCorrupt = skipCorrupt; - return this; - } - - public TimestampStreamReader build() throws IOException { - SettableUncompressedStream present = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), - fileId, presentStream); - - SettableUncompressedStream data = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, - dataStream); - - SettableUncompressedStream nanos = StreamUtils.createLlapInStream(OrcProto.Stream.Kind.SECONDARY.name(), - fileId, nanosStream); - - boolean isFileCompressed = compressionCodec != null; - return new TimestampStreamReader(columnIndex, present, data, nanos, - isFileCompressed, columnEncoding, skipCorrupt); - } - } - - public static StreamReaderBuilder builder() { - return new StreamReaderBuilder(); - } -} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java index 70ffb21..1280d8f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java @@ -673,35 +673,4 @@ private ColumnVector allocateColumnVector(String type, int defaultSize) { throw new Error("Cannot allocate vector column for " + type); } } - - public VectorColumnAssign[] buildObjectAssigners(VectorizedRowBatch outputBatch) - throws HiveException { - List fieldRefs = rowOI.getAllStructFieldRefs(); - assert outputBatch.numCols == fieldRefs.size(); - VectorColumnAssign[] assigners = new VectorColumnAssign[fieldRefs.size()]; - for(int i = 0; i < assigners.length; ++i) { - StructField fieldRef = fieldRefs.get(i); - ObjectInspector fieldOI = fieldRef.getFieldObjectInspector(); - assigners[i] = VectorColumnAssignFactory.buildObjectAssign( - outputBatch, i, fieldOI); - } - return assigners; - } - - public int[] getIncludedColumnIndexes() { - int colCount = (colsToInclude == null) - ? rowOI.getAllStructFieldRefs().size() : colsToInclude.size(); - int[] result = new int[colCount]; - if (colsToInclude == null) { - for (int i = 0; i < result.length; ++i) { - result[i] = i; - } - } else { - int i = -1; - for (int colIx : colsToInclude) { - result[++i] = colIx; - } - } - return result; - } } diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/EncodedRecordReaderImplFactory.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/EncodedRecordReaderImplFactory.java new file mode 100644 index 0000000..fe605a9 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/EncodedRecordReaderImplFactory.java @@ -0,0 +1,2033 @@ +/** + * 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.io.orc; + +import java.io.IOException; +import java.util.List; + +import org.apache.hadoop.hive.common.DiskRange; +import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; +import org.apache.hadoop.hive.llap.io.api.orc.OrcBatchKey; + +import com.google.common.collect.Lists; + +/** + * + */ +public class EncodedRecordReaderImplFactory extends RecordReaderImplFactory { + + protected static class TimestampStreamReader extends TimestampTreeReader { + private boolean isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _secondsStream; + private SettableUncompressedStream _nanosStream; + + private TimestampStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, SettableUncompressedStream nanos, boolean isFileCompressed, + OrcProto.ColumnEncoding encoding, boolean skipCorrupt) throws IOException { + super(columnId, present, data, nanos, encoding, skipCorrupt); + this.isFileCompressed = isFileCompressed; + this._presentStream = present; + this._secondsStream = data; + this._nanosStream = nanos; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_secondsStream.available() > 0) { + if (isFileCompressed) { + index.getNext(); + } + data.seek(index); + } + + if (_nanosStream.available() > 0) { + if (isFileCompressed) { + index.getNext(); + } + nanos.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_secondsStream != null) { + List secondsDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, secondsDiskRanges); + _secondsStream.setBuffers(secondsDiskRanges, length); + } + if (_nanosStream != null) { + List nanosDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(secondaryStreamBuffer, nanosDiskRanges); + _nanosStream.setBuffers(nanosDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private EncodedColumnBatch.StreamBuffer nanosStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + private boolean skipCorrupt; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setSecondsStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setNanosStream(EncodedColumnBatch.StreamBuffer secondaryStream) { + this.nanosStream = secondaryStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public StreamReaderBuilder skipCorrupt(boolean skipCorrupt) { + this.skipCorrupt = skipCorrupt; + return this; + } + + public TimestampStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + SettableUncompressedStream nanos = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.SECONDARY.name(), + fileId, nanosStream); + + boolean isFileCompressed = compressionCodec != null; + return new TimestampStreamReader(columnIndex, present, data, nanos, + isFileCompressed, columnEncoding, skipCorrupt); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class StringStreamReader extends StringTreeReader { + private boolean _isFileCompressed; + private boolean _isDictionaryEncoding; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + private SettableUncompressedStream _lengthStream; + private SettableUncompressedStream _dictionaryStream; + + private StringStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, SettableUncompressedStream length, + SettableUncompressedStream dictionary, + boolean isFileCompressed, OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, length, dictionary, encoding); + this._isDictionaryEncoding = dictionary != null; + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + this._lengthStream = length; + this._dictionaryStream = dictionary; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + reader.present.seek(index); + } + + if (_isDictionaryEncoding) { + // DICTIONARY encoding + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDictionaryTreeReader) reader).reader.seek(index); + } + } else { + // DIRECT encoding + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDirectTreeReader) reader).stream.seek(index); + } + + if (_lengthStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDirectTreeReader) reader).lengths.seek(index); + } + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + if (!_isDictionaryEncoding) { + if (_lengthStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthStream.setBuffers(lengthDiskRanges, length); + } + } + + // set these streams only if the stripe is different + if (!sameStripe && _isDictionaryEncoding) { + if (_lengthStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthStream.setBuffers(lengthDiskRanges, length); + } + if (_dictionaryStream != null) { + List dictionaryDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dictionaryStreamBuffer, dictionaryDiskRanges); + _dictionaryStream.setBuffers(dictionaryDiskRanges, length); + } + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private EncodedColumnBatch.StreamBuffer dictionaryStream; + private EncodedColumnBatch.StreamBuffer lengthStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer lengthStream) { + this.lengthStream = lengthStream; + return this; + } + + public StreamReaderBuilder setDictionaryStream(EncodedColumnBatch.StreamBuffer dictStream) { + this.dictionaryStream = dictStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public StringStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + SettableUncompressedStream length = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.LENGTH.name(), fileId, + lengthStream); + + SettableUncompressedStream dictionary = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.DICTIONARY_DATA.name(), fileId, dictionaryStream); + + boolean isFileCompressed = compressionCodec != null; + return new StringStreamReader(columnIndex, present, data, length, dictionary, + isFileCompressed, columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + + } + + protected static class ShortStreamReader extends ShortTreeReader { + private boolean isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private ShortStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, encoding); + this.isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (isFileCompressed) { + index.getNext(); + } + reader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public ShortStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new ShortStreamReader(columnIndex, present, data, isFileCompressed, + columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class LongStreamReader extends LongTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private LongStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed, + OrcProto.ColumnEncoding encoding, boolean skipCorrupt) throws IOException { + super(columnId, present, data, encoding, skipCorrupt); + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + reader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + private boolean skipCorrupt; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public StreamReaderBuilder skipCorrupt(boolean skipCorrupt) { + this.skipCorrupt = skipCorrupt; + return this; + } + + public LongStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new LongStreamReader(columnIndex, present, data, isFileCompressed, + columnEncoding, skipCorrupt); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class IntStreamReader extends IntTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private IntStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, encoding); + this._isFileCompressed = isFileCompressed; + this._dataStream = data; + this._presentStream = present; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + reader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public IntStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new IntStreamReader(columnIndex, present, data, isFileCompressed, + columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + + } + + protected static class FloatStreamReader extends FloatTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private FloatStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed) throws IOException { + super(columnId, present, data); + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + stream.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public FloatStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new FloatStreamReader(columnIndex, present, data, isFileCompressed); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + + } + + protected static class DoubleStreamReader extends DoubleTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private DoubleStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed) throws IOException { + super(columnId, present, data); + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + stream.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public DoubleStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new DoubleStreamReader(columnIndex, present, data, isFileCompressed); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class DecimalStreamReader extends DecimalTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _valueStream; + private SettableUncompressedStream _scaleStream; + + private DecimalStreamReader(int columnId, int precision, int scale, + SettableUncompressedStream presentStream, + SettableUncompressedStream valueStream, SettableUncompressedStream scaleStream, + boolean isFileCompressed, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, precision, scale, presentStream, valueStream, scaleStream, encoding); + this._isFileCompressed = isFileCompressed; + this._presentStream = presentStream; + this._valueStream = valueStream; + this._scaleStream = scaleStream; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_valueStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + valueStream.seek(index); + } + + if (_scaleStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + scaleReader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_valueStream != null) { + List valueDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, valueDiskRanges); + _valueStream.setBuffers(valueDiskRanges, length); + } + if (_scaleStream != null) { + List scaleDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(secondaryStreamBuffer, scaleDiskRanges); + _scaleStream.setBuffers(scaleDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer valueStream; + private EncodedColumnBatch.StreamBuffer scaleStream; + private int scale; + private int precision; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPrecision(int precision) { + this.precision = precision; + return this; + } + + public StreamReaderBuilder setScale(int scale) { + this.scale = scale; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setValueStream(EncodedColumnBatch.StreamBuffer valueStream) { + this.valueStream = valueStream; + return this; + } + + public StreamReaderBuilder setScaleStream(EncodedColumnBatch.StreamBuffer scaleStream) { + this.scaleStream = scaleStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public DecimalStreamReader build() throws IOException { + SettableUncompressedStream presentInStream = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.PRESENT.name(), fileId, presentStream); + + SettableUncompressedStream valueInStream = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.DATA.name(), fileId, valueStream); + + SettableUncompressedStream scaleInStream = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.SECONDARY.name(), fileId, scaleStream); + + boolean isFileCompressed = compressionCodec != null; + return new DecimalStreamReader(columnIndex, precision, scale, presentInStream, + valueInStream, + scaleInStream, isFileCompressed, columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class DateStreamReader extends DateTreeReader { + private boolean isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private DateStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, encoding); + this.isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (isFileCompressed) { + index.getNext(); + } + reader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public DateStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new DateStreamReader(columnIndex, present, data, isFileCompressed, + columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class CharStreamReader extends CharTreeReader { + private boolean _isFileCompressed; + private boolean _isDictionaryEncoding; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + private SettableUncompressedStream _lengthStream; + private SettableUncompressedStream _dictionaryStream; + + private CharStreamReader(int columnId, int maxLength, + SettableUncompressedStream present, SettableUncompressedStream data, + SettableUncompressedStream length, SettableUncompressedStream dictionary, + boolean isFileCompressed, OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, maxLength, present, data, length, + dictionary, encoding); + this._isDictionaryEncoding = dictionary != null; + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + this._lengthStream = length; + this._dictionaryStream = dictionary; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + reader.present.seek(index); + } + + if (_isDictionaryEncoding) { + // DICTIONARY encoding + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDictionaryTreeReader) reader).reader.seek(index); + } + } else { + // DIRECT encoding + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDirectTreeReader) reader).stream.seek(index); + } + + if (_lengthStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDirectTreeReader) reader).lengths.seek(index); + } + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + if (!_isDictionaryEncoding) { + if (_lengthStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthStream.setBuffers(lengthDiskRanges, length); + } + } + + // set these streams only if the stripe is different + if (!sameStripe && _isDictionaryEncoding) { + if (_lengthStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthStream.setBuffers(lengthDiskRanges, length); + } + if (_dictionaryStream != null) { + List dictionaryDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dictionaryStreamBuffer, dictionaryDiskRanges); + _dictionaryStream.setBuffers(dictionaryDiskRanges, length); + } + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private int maxLength; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private EncodedColumnBatch.StreamBuffer dictionaryStream; + private EncodedColumnBatch.StreamBuffer lengthStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setMaxLength(int maxLength) { + this.maxLength = maxLength; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer lengthStream) { + this.lengthStream = lengthStream; + return this; + } + + public StreamReaderBuilder setDictionaryStream(EncodedColumnBatch.StreamBuffer dictStream) { + this.dictionaryStream = dictStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public CharStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + SettableUncompressedStream length = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.LENGTH.name(), fileId, + lengthStream); + + SettableUncompressedStream dictionary = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.DICTIONARY_DATA.name(), fileId, dictionaryStream); + + boolean isFileCompressed = compressionCodec != null; + return new CharStreamReader(columnIndex, maxLength, present, data, length, + dictionary, isFileCompressed, columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + + } + + protected static class VarcharStreamReader extends VarcharTreeReader { + private boolean _isFileCompressed; + private boolean _isDictionaryEncoding; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + private SettableUncompressedStream _lengthStream; + private SettableUncompressedStream _dictionaryStream; + + private VarcharStreamReader(int columnId, int maxLength, + SettableUncompressedStream present, SettableUncompressedStream data, + SettableUncompressedStream length, SettableUncompressedStream dictionary, + boolean isFileCompressed, OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, maxLength, present, data, length, + dictionary, encoding); + this._isDictionaryEncoding = dictionary != null; + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + this._lengthStream = length; + this._dictionaryStream = dictionary; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + reader.present.seek(index); + } + + if (_isDictionaryEncoding) { + // DICTIONARY encoding + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDictionaryTreeReader) reader).reader.seek(index); + } + } else { + // DIRECT encoding + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDirectTreeReader) reader).stream.seek(index); + } + + if (_lengthStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + ((StringDirectTreeReader) reader).lengths.seek(index); + } + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + if (!_isDictionaryEncoding) { + if (_lengthStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthStream.setBuffers(lengthDiskRanges, length); + } + } + + // set these streams only if the stripe is different + if (!sameStripe && _isDictionaryEncoding) { + if (_lengthStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthStream.setBuffers(lengthDiskRanges, length); + } + if (_dictionaryStream != null) { + List dictionaryDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dictionaryStreamBuffer, dictionaryDiskRanges); + _dictionaryStream.setBuffers(dictionaryDiskRanges, length); + } + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private int maxLength; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private EncodedColumnBatch.StreamBuffer dictionaryStream; + private EncodedColumnBatch.StreamBuffer lengthStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setMaxLength(int maxLength) { + this.maxLength = maxLength; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer lengthStream) { + this.lengthStream = lengthStream; + return this; + } + + public StreamReaderBuilder setDictionaryStream(EncodedColumnBatch.StreamBuffer dictStream) { + this.dictionaryStream = dictStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public VarcharStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + SettableUncompressedStream length = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.LENGTH.name(), fileId, + lengthStream); + + SettableUncompressedStream dictionary = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.DICTIONARY_DATA.name(), fileId, dictionaryStream); + + boolean isFileCompressed = compressionCodec != null; + return new VarcharStreamReader(columnIndex, maxLength, present, data, length, + dictionary, isFileCompressed, columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + + } + + protected static class ByteStreamReader extends ByteTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private ByteStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed) throws IOException { + super(columnId, present, data); + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + reader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public ByteStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new ByteStreamReader(columnIndex, present, data, isFileCompressed); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class BinaryStreamReader extends BinaryTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + private SettableUncompressedStream _lengthsStream; + + private BinaryStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, SettableUncompressedStream length, + boolean isFileCompressed, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, length, encoding); + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + this._lengthsStream = length; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + stream.seek(index); + } + + if (lengths != null && _lengthsStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + lengths.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + if (_lengthsStream != null) { + List lengthDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(lengthsStreamBuffer, lengthDiskRanges); + _lengthsStream.setBuffers(lengthDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private EncodedColumnBatch.StreamBuffer lengthStream; + private CompressionCodec compressionCodec; + private OrcProto.ColumnEncoding columnEncoding; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setLengthStream(EncodedColumnBatch.StreamBuffer secondaryStream) { + this.lengthStream = secondaryStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public StreamReaderBuilder setColumnEncoding(OrcProto.ColumnEncoding encoding) { + this.columnEncoding = encoding; + return this; + } + + public BinaryStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.PRESENT.name(), fileId, presentStream); + + SettableUncompressedStream data = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.DATA.name(), fileId, dataStream); + + SettableUncompressedStream length = StreamUtils.createLlapInStream( + OrcProto.Stream.Kind.LENGTH.name(), fileId, lengthStream); + + boolean isFileCompressed = compressionCodec != null; + return new BinaryStreamReader(columnIndex, present, data, length, isFileCompressed, + columnEncoding); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + protected static class BooleanStreamReader extends BooleanTreeReader { + private boolean _isFileCompressed; + private SettableUncompressedStream _presentStream; + private SettableUncompressedStream _dataStream; + + private BooleanStreamReader(int columnId, SettableUncompressedStream present, + SettableUncompressedStream data, boolean isFileCompressed) throws IOException { + super(columnId, present, data); + this._isFileCompressed = isFileCompressed; + this._presentStream = present; + this._dataStream = data; + } + + @Override + public void seek(PositionProvider index) throws IOException { + if (present != null) { + if (_isFileCompressed) { + index.getNext(); + } + present.seek(index); + } + + // data stream could be empty stream or already reached end of stream before present stream. + // This can happen if all values in stream are nulls or last row group values are all null. + if (_dataStream.available() > 0) { + if (_isFileCompressed) { + index.getNext(); + } + reader.seek(index); + } + } + + @Override + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + super.setBuffers(buffers, sameStripe); + if (_presentStream != null) { + List presentDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(presentStreamBuffer, presentDiskRanges); + _presentStream.setBuffers(presentDiskRanges, length); + } + if (_dataStream != null) { + List dataDiskRanges = Lists.newArrayList(); + long length = StreamUtils.createDiskRanges(dataStreamBuffer, dataDiskRanges); + _dataStream.setBuffers(dataDiskRanges, length); + } + } + + public static class StreamReaderBuilder { + private Long fileId; + private int columnIndex; + private EncodedColumnBatch.StreamBuffer presentStream; + private EncodedColumnBatch.StreamBuffer dataStream; + private CompressionCodec compressionCodec; + + public StreamReaderBuilder setFileId(Long fileId) { + this.fileId = fileId; + return this; + } + + public StreamReaderBuilder setColumnIndex(int columnIndex) { + this.columnIndex = columnIndex; + return this; + } + + public StreamReaderBuilder setPresentStream(EncodedColumnBatch.StreamBuffer presentStream) { + this.presentStream = presentStream; + return this; + } + + public StreamReaderBuilder setDataStream(EncodedColumnBatch.StreamBuffer dataStream) { + this.dataStream = dataStream; + return this; + } + + public StreamReaderBuilder setCompressionCodec(CompressionCodec compressionCodec) { + this.compressionCodec = compressionCodec; + return this; + } + + public BooleanStreamReader build() throws IOException { + SettableUncompressedStream present = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.PRESENT.name(), + fileId, presentStream); + + SettableUncompressedStream data = StreamUtils + .createLlapInStream(OrcProto.Stream.Kind.DATA.name(), fileId, + dataStream); + + boolean isFileCompressed = compressionCodec != null; + return new BooleanStreamReader(columnIndex, present, data, isFileCompressed); + } + } + + public static StreamReaderBuilder builder() { + return new StreamReaderBuilder(); + } + } + + public static TreeReader[] createEncodedTreeReader(int numCols, + List types, + List encodings, + EncodedColumnBatch batch, + CompressionCodec codec, boolean skipCorrupt) throws IOException { + long file = batch.batchKey.file; + TreeReader[] treeReaders = new TreeReader[numCols]; + for (int i = 0; i < numCols; i++) { + int columnIndex = batch.columnIxs[i]; + EncodedColumnBatch.StreamBuffer[] streamBuffers = batch.columnData[i]; + OrcProto.Type columnType = types.get(columnIndex); + + // EncodedColumnBatch is already decompressed, we don't really need to pass codec. + // But we need to know if the original data is compressed or not. This is used to skip + // positions in row index properly. If the file is originally compressed, + // then 1st position (compressed offset) in row index should be skipped to get + // uncompressed offset, else 1st position should not be skipped. + // TODO: there should be a better way to do this, code just needs to be modified + OrcProto.ColumnEncoding columnEncoding = encodings.get(columnIndex); + + // stream buffers are arranged in enum order of stream kind + EncodedColumnBatch.StreamBuffer present = null; + EncodedColumnBatch.StreamBuffer data = null; + EncodedColumnBatch.StreamBuffer dictionary = null; + EncodedColumnBatch.StreamBuffer lengths = null; + EncodedColumnBatch.StreamBuffer secondary = null; + for (EncodedColumnBatch.StreamBuffer streamBuffer : streamBuffers) { + switch (streamBuffer.streamKind) { + case 0: + // PRESENT stream + present = streamBuffer; + break; + case 1: + // DATA stream + data = streamBuffer; + break; + case 2: + // LENGTH stream + lengths = streamBuffer; + break; + case 3: + // DICTIONARY_DATA stream + dictionary = streamBuffer; + break; + case 5: + // SECONDARY stream + secondary = streamBuffer; + break; + default: + throw new IOException("Unexpected stream kind: " + streamBuffer.streamKind); + } + } + + switch (columnType.getKind()) { + case BINARY: + treeReaders[i] = BinaryStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setLengthStream(lengths) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case BOOLEAN: + treeReaders[i] = BooleanStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .build(); + break; + case BYTE: + treeReaders[i] = ByteStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .build(); + break; + case SHORT: + treeReaders[i] = ShortStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case INT: + treeReaders[i] = IntStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case LONG: + treeReaders[i] = LongStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .skipCorrupt(skipCorrupt) + .build(); + break; + case FLOAT: + treeReaders[i] = FloatStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .build(); + break; + case DOUBLE: + treeReaders[i] = DoubleStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .build(); + break; + case CHAR: + treeReaders[i] = CharStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setMaxLength(columnType.getMaximumLength()) + .setPresentStream(present) + .setDataStream(data) + .setLengthStream(lengths) + .setDictionaryStream(dictionary) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case VARCHAR: + treeReaders[i] = VarcharStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setMaxLength(columnType.getMaximumLength()) + .setPresentStream(present) + .setDataStream(data) + .setLengthStream(lengths) + .setDictionaryStream(dictionary) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case STRING: + treeReaders[i] = StringStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setLengthStream(lengths) + .setDictionaryStream(dictionary) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case DECIMAL: + treeReaders[i] = DecimalStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPrecision(columnType.getPrecision()) + .setScale(columnType.getScale()) + .setPresentStream(present) + .setValueStream(data) + .setScaleStream(secondary) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + case TIMESTAMP: + treeReaders[i] = TimestampStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setSecondsStream(data) + .setNanosStream(secondary) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .skipCorrupt(skipCorrupt) + .build(); + break; + case DATE: + treeReaders[i] = DateStreamReader.builder() + .setFileId(file) + .setColumnIndex(columnIndex) + .setPresentStream(present) + .setDataStream(data) + .setCompressionCodec(codec) + .setColumnEncoding(columnEncoding) + .build(); + break; + default: + throw new UnsupportedOperationException("Data type not supported yet! " + columnType); + } + } + + return treeReaders; + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/InStream.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/InStream.java index aa502b0..091052d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/InStream.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/InStream.java @@ -64,7 +64,7 @@ public long getStreamLength() { return length; } - public static class UncompressedStream extends InStream { + static class UncompressedStream extends InStream { private List bytes; private long length; private long currentOffset; diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java index 0ed2372..8e0f42e 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImpl.java @@ -19,22 +19,16 @@ import static org.apache.hadoop.hive.conf.HiveConf.ConfVars.HIVE_ORC_ZEROCOPY; -import java.io.EOFException; import java.io.IOException; import java.math.BigDecimal; -import java.math.BigInteger; import java.nio.ByteBuffer; import java.sql.Date; import java.sql.Timestamp; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; @@ -50,35 +44,17 @@ import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.llap.io.api.cache.LlapMemoryBuffer; -import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; -import org.apache.hadoop.hive.ql.exec.vector.DecimalColumnVector; -import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; -import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; -import org.apache.hadoop.hive.ql.exec.vector.TimestampUtils; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; -import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; import org.apache.hadoop.hive.ql.io.filters.BloomFilter; import org.apache.hadoop.hive.ql.io.orc.RecordReaderUtils.ByteBufferAllocatorPool; import org.apache.hadoop.hive.ql.io.sarg.PredicateLeaf; import org.apache.hadoop.hive.ql.io.sarg.SearchArgument; import org.apache.hadoop.hive.ql.io.sarg.SearchArgument.TruthValue; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; -import org.apache.hadoop.hive.serde2.io.ByteWritable; import org.apache.hadoop.hive.serde2.io.DateWritable; -import org.apache.hadoop.hive.serde2.io.DoubleWritable; -import org.apache.hadoop.hive.serde2.io.HiveCharWritable; -import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; -import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable; -import org.apache.hadoop.hive.serde2.io.ShortWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; -import org.apache.hadoop.hive.serde2.typeinfo.HiveDecimalUtils; import org.apache.hadoop.hive.shims.HadoopShims.ZeroCopyReaderShim; -import org.apache.hadoop.io.BooleanWritable; -import org.apache.hadoop.io.BytesWritable; -import org.apache.hadoop.io.FloatWritable; -import org.apache.hadoop.io.IntWritable; -import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; public class RecordReaderImpl implements RecordReader { @@ -91,7 +67,7 @@ private final FSDataInputStream file; private final long firstRow; private final List stripes = - new ArrayList(); + new ArrayList(); private OrcProto.StripeFooter stripeFooter; private final long totalRowCount; private final CompressionCodec codec; @@ -106,7 +82,7 @@ private final Map streams = new HashMap(); DiskRangeList bufferChunks = null; - private final TreeReader reader; + private final RecordReaderImplFactory.TreeReader reader; private final OrcProto.RowIndex[] indexes; private final OrcProto.BloomFilterIndex[] bloomFilterIndices; private final SargApplier sargApp; @@ -142,15 +118,16 @@ public void setRowGroupIndex(OrcProto.RowIndex[] rowGroupIndex) { /** * Given a list of column names, find the given column and return the index. + * * @param columnNames the list of potential column names - * @param columnName the column name to look for - * @param rootColumn offset the result with the rootColumn + * @param columnName the column name to look for + * @param rootColumn offset the result with the rootColumn * @return the column number or -1 if the column wasn't found */ static int findColumns(String[] columnNames, - String columnName, - int rootColumn) { - for(int i=0; i < columnNames.length; ++i) { + String columnName, + int rootColumn) { + for (int i = 0; i < columnNames.length; ++i) { if (columnName.equals(columnNames[i])) { return i + rootColumn; } @@ -160,18 +137,19 @@ static int findColumns(String[] columnNames, /** * Find the mapping from predicate leaves to columns. - * @param sargLeaves the search argument that we need to map + * + * @param sargLeaves the search argument that we need to map * @param columnNames the names of the columns - * @param rootColumn the offset of the top level row, which offsets the - * result + * @param rootColumn the offset of the top level row, which offsets the + * result * @return an array mapping the sarg leaves to concrete column numbers */ public static int[] mapSargColumns(List sargLeaves, - String[] columnNames, - int rootColumn) { + String[] columnNames, + int rootColumn) { int[] result = new int[sargLeaves.size()]; Arrays.fill(result, -1); - for(int i=0; i < result.length; ++i) { + for (int i = 0; i < result.length; ++i) { String colName = sargLeaves.get(i).getColumnName(); result[i] = findColumns(columnNames, colName, rootColumn); } @@ -179,15 +157,15 @@ static int findColumns(String[] columnNames, } protected RecordReaderImpl(List stripes, - FileSystem fileSystem, - Path path, - Reader.Options options, - List types, - CompressionCodec codec, - int bufferSize, - long strideRate, - Configuration conf - ) throws IOException { + FileSystem fileSystem, + Path path, + Reader.Options options, + List types, + CompressionCodec codec, + int bufferSize, + long strideRate, + Configuration conf + ) throws IOException { this.fileSystem = fileSystem; this.path = path; this.file = fileSystem.open(path); @@ -209,7 +187,7 @@ protected RecordReaderImpl(List stripes, long skippedRows = 0; long offset = options.getOffset(); long maxOffset = options.getMaxOffset(); - for(StripeInformation stripe: stripes) { + for (StripeInformation stripe : stripes) { long stripeStart = stripe.getOffset(); if (offset > stripeStart) { skippedRows += stripe.getNumberOfRows(); @@ -226,7 +204,7 @@ protected RecordReaderImpl(List stripes, firstRow = skippedRows; totalRowCount = rows; boolean skipCorrupt = HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_ORC_SKIP_CORRUPT_DATA); - reader = createTreeReader(0, types, included, skipCorrupt); + reader = RecordReaderImplFactory.createTreeReader(0, types, included, skipCorrupt); indexes = new OrcProto.RowIndex[types.size()]; bloomFilterIndices = new OrcProto.BloomFilterIndex[types.size()]; advanceToNextRow(reader, 0L, true); @@ -251,2292 +229,6 @@ public long getNext() { } } - public abstract static class TreeReader { - protected final int columnId; - public BitFieldReader present = null; - protected boolean valuePresent = false; - - public TreeReader(int columnId) throws IOException { - this(columnId, null); - } - - public TreeReader(int columnId, InStream in) throws IOException { - this.columnId = columnId; - if (in == null) { - present = null; - valuePresent = true; - } else { - present = new BitFieldReader(in, 1); - } - } - - void setInStream(InStream inStream) { - if (present != null) { - present.setInStream(inStream); - } - } - - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - IntegerReader createIntegerReader(OrcProto.ColumnEncoding.Kind kind, - InStream in, - boolean signed, boolean skipCorrupt) throws IOException { - switch (kind) { - case DIRECT_V2: - case DICTIONARY_V2: - return new RunLengthIntegerReaderV2(in, signed, skipCorrupt); - case DIRECT: - case DICTIONARY: - return new RunLengthIntegerReader(in, signed); - default: - throw new IllegalArgumentException("Unknown encoding " + kind); - } - } - - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - checkEncoding(stripeFooter.getColumnsList().get(columnId)); - InStream in = streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.PRESENT)); - if (in == null) { - present = null; - valuePresent = true; - } else { - present = new BitFieldReader(in, 1); - } - } - - /** - * Seek to the given position. - * @param index the indexes loaded from the file - * @throws IOException - */ - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - public void seek(PositionProvider index) throws IOException { - if (present != null) { - present.seek(index); - } - } - - protected long countNonNulls(long rows) throws IOException { - if (present != null) { - long result = 0; - for(long c=0; c < rows; ++c) { - if (present.next() == 1) { - result += 1; - } - } - return result; - } else { - return rows; - } - } - - abstract void skipRows(long rows) throws IOException; - - Object next(Object previous) throws IOException { - if (present != null) { - valuePresent = present.next() == 1; - } - return previous; - } - /** - * Populates the isNull vector array in the previousVector object based on - * the present stream values. This function is called from all the child - * readers, and they all set the values based on isNull field value. - * @param previousVector The columnVector object whose isNull value is populated - * @param batchSize Size of the column vector - * @return - * @throws IOException - */ - public Object nextVector(Object previousVector, long batchSize) throws IOException { - ColumnVector result = (ColumnVector) previousVector; - if (present != null) { - // Set noNulls and isNull vector of the ColumnVector based on - // present stream - result.noNulls = true; - for (int i = 0; i < batchSize; i++) { - result.isNull[i] = (present.next() != 1); - if (result.noNulls && result.isNull[i]) { - result.noNulls = false; - } - } - } else { - // There is not present stream, this means that all the values are - // present. - result.noNulls = true; - for (int i = 0; i < batchSize; i++) { - result.isNull[i] = false; - } - } - return previousVector; - } - } - - public static class BooleanTreeReader extends TreeReader { - protected BitFieldReader reader = null; - - public BooleanTreeReader(int columnId) throws IOException { - this(columnId, null, null); - } - - public BooleanTreeReader(int columnId, InStream present, InStream data) throws IOException { - super(columnId, present); - if (data != null) { - reader = new BitFieldReader(data, 1); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - reader = new BitFieldReader(streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.DATA)), 1); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - BooleanWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new BooleanWritable(); - } else { - result = (BooleanWritable) previous; - } - result.set(reader.next() == 1); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - reader.nextVector(result, batchSize); - return result; - } - } - - public static class ByteTreeReader extends TreeReader{ - protected RunLengthByteReader reader = null; - - ByteTreeReader(int columnId) throws IOException { - this(columnId, null, null); - } - - public ByteTreeReader(int columnId, InStream present, InStream data) throws IOException { - super(columnId, present); - this.reader = new RunLengthByteReader(data); - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - reader = new RunLengthByteReader(streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.DATA))); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - ByteWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new ByteWritable(); - } else { - result = (ByteWritable) previous; - } - result.set(reader.next()); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - reader.nextVector(result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - } - - public static class ShortTreeReader extends TreeReader{ - protected IntegerReader reader = null; - - public ShortTreeReader(int columnId) throws IOException { - this(columnId, null, null, null); - } - - public ShortTreeReader(int columnId, InStream present, InStream data, - OrcProto.ColumnEncoding encoding) - throws IOException { - super(columnId, present); - if (data != null && encoding != null) { - checkEncoding(encoding); - this.reader = createIntegerReader(encoding.getKind(), data, true, false); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(name), true, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - ShortWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new ShortWritable(); - } else { - result = (ShortWritable) previous; - } - result.set((short) reader.next()); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - reader.nextVector(result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - } - - public static class IntTreeReader extends TreeReader{ - protected IntegerReader reader = null; - - public IntTreeReader(int columnId) throws IOException { - this(columnId, null, null, null); - } - - public IntTreeReader(int columnId, InStream present, InStream data, - OrcProto.ColumnEncoding encoding) - throws IOException { - super(columnId, present); - if (data != null && encoding != null) { - checkEncoding(encoding); - this.reader = createIntegerReader(encoding.getKind(), data, true, false); - } - } - - void setInStream(InStream inStream) { - if (reader != null) { - reader.setInStream(inStream); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - // TODO: stripeFooter.getColumnsList()? - reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(name), true, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - IntWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new IntWritable(); - } else { - result = (IntWritable) previous; - } - result.set((int) reader.next()); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - reader.nextVector(result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - } - - public static class LongTreeReader extends TreeReader{ - protected IntegerReader reader = null; - - LongTreeReader(int columnId, boolean skipCorrupt) throws IOException { - this(columnId, null, null, null, skipCorrupt); - } - - public LongTreeReader(int columnId, InStream present, InStream data, - OrcProto.ColumnEncoding encoding, - boolean skipCorrupt) - throws IOException { - super(columnId, present); - if (data != null && encoding != null) { - checkEncoding(encoding); - this.reader = createIntegerReader(encoding.getKind(), data, true, skipCorrupt); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(name), true, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - LongWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new LongWritable(); - } else { - result = (LongWritable) previous; - } - result.set(reader.next()); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - reader.nextVector(result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - } - - public static class FloatTreeReader extends TreeReader{ - protected InStream stream; - private final SerializationUtils utils; - - public FloatTreeReader(int columnId) throws IOException { - this(columnId, null, null); - } - - public FloatTreeReader(int columnId, InStream present, InStream data) throws IOException { - super(columnId, present); - this.utils = new SerializationUtils(); - this.stream = data; - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - stream = streams.get(name); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - stream.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - FloatWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new FloatWritable(); - } else { - result = (FloatWritable) previous; - } - result.set(utils.readFloat(stream)); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - DoubleColumnVector result = null; - if (previousVector == null) { - result = new DoubleColumnVector(); - } else { - result = (DoubleColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - for (int i = 0; i < batchSize; i++) { - if (!result.isNull[i]) { - result.vector[i] = utils.readFloat(stream); - } else { - - // If the value is not present then set NaN - result.vector[i] = Double.NaN; - } - } - - // Set isRepeating flag - result.isRepeating = true; - for (int i = 0; (i < batchSize - 1 && result.isRepeating); i++) { - if (result.vector[i] != result.vector[i + 1]) { - result.isRepeating = false; - } - } - return result; - } - - @Override - protected void skipRows(long items) throws IOException { - items = countNonNulls(items); - for(int i=0; i < items; ++i) { - utils.readFloat(stream); - } - } - } - - public static class DoubleTreeReader extends TreeReader{ - protected InStream stream; - private final SerializationUtils utils; - - public DoubleTreeReader(int columnId) throws IOException { - this(columnId, null, null); - } - - public DoubleTreeReader(int columnId, InStream present, InStream data) throws IOException { - super(columnId, present); - this.utils = new SerializationUtils(); - this.stream = data; - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = - new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - stream = streams.get(name); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - stream.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - DoubleWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new DoubleWritable(); - } else { - result = (DoubleWritable) previous; - } - result.set(utils.readDouble(stream)); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - DoubleColumnVector result = null; - if (previousVector == null) { - result = new DoubleColumnVector(); - } else { - result = (DoubleColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - for (int i = 0; i < batchSize; i++) { - if (!result.isNull[i]) { - result.vector[i] = utils.readDouble(stream); - } else { - // If the value is not present then set NaN - result.vector[i] = Double.NaN; - } - } - - // Set isRepeating flag - result.isRepeating = true; - for (int i = 0; (i < batchSize - 1 && result.isRepeating); i++) { - if (result.vector[i] != result.vector[i + 1]) { - result.isRepeating = false; - } - } - return result; - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - stream.skip(items * 8); - } - } - - public static class BinaryTreeReader extends TreeReader{ - protected InStream stream; - protected IntegerReader lengths = null; - - protected final LongColumnVector scratchlcv; - - BinaryTreeReader(int columnId) throws IOException { - this(columnId, null, null, null, null); - } - - public BinaryTreeReader(int columnId, InStream present, InStream data, InStream length, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present); - scratchlcv = new LongColumnVector(); - this.stream = data; - if (length != null && encoding != null) { - checkEncoding(encoding); - this.lengths = createIntegerReader(encoding.getKind(), length, false, false); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - stream = streams.get(name); - lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, OrcProto.Stream.Kind.LENGTH)), false, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - stream.seek(index); - lengths.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - BytesWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new BytesWritable(); - } else { - result = (BytesWritable) previous; - } - int len = (int) lengths.next(); - result.setSize(len); - int offset = 0; - while (len > 0) { - int written = stream.read(result.getBytes(), offset, len); - if (written < 0) { - throw new EOFException("Can't finish byte read from " + stream); - } - len -= written; - offset += written; - } - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - BytesColumnVector result = null; - if (previousVector == null) { - result = new BytesColumnVector(); - } else { - result = (BytesColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - BytesColumnVectorUtil.readOrcByteArrays(stream, lengths, scratchlcv, result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - long lengthToSkip = 0; - for(int i=0; i < items; ++i) { - lengthToSkip += lengths.next(); - } - stream.skip(lengthToSkip); - } - } - - public static class TimestampTreeReader extends TreeReader{ - protected IntegerReader data = null; - protected IntegerReader nanos = null; - protected final boolean skipCorrupt; - protected Map baseTimestampMap; - protected long base_timestamp; - protected final TimeZone readerTimeZone; - protected TimeZone writerTimeZone; - protected boolean hasSameTZRules; - - TimestampTreeReader(int columnId, boolean skipCorrupt) throws IOException { - this(columnId, null, null, null, null, skipCorrupt); - } - - public TimestampTreeReader(int columnId, InStream presentStream, InStream dataStream, - InStream nanosStream, OrcProto.ColumnEncoding encoding, boolean skipCorrupt) - throws IOException { - super(columnId, presentStream); - this.skipCorrupt = skipCorrupt; - this.baseTimestampMap = new HashMap<>(); - this.readerTimeZone = TimeZone.getDefault(); - this.writerTimeZone = readerTimeZone; - this.hasSameTZRules = writerTimeZone.hasSameRules(readerTimeZone); - this.base_timestamp = getBaseTimestamp(readerTimeZone.getID()); - if (encoding != null) { - checkEncoding(encoding); - - if (dataStream != null) { - this.data = createIntegerReader(encoding.getKind(), dataStream, true, skipCorrupt); - } - - if (nanosStream != null) { - this.nanos = createIntegerReader(encoding.getKind(), nanosStream, false, skipCorrupt); - } - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - data = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.DATA)), true, skipCorrupt); - nanos = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.SECONDARY)), false, skipCorrupt); - base_timestamp = getBaseTimestamp(stripeFooter.getWriterTimezone()); - } - - private long getBaseTimestamp(String timeZoneId) throws IOException { - // to make sure new readers read old files in the same way - if (timeZoneId == null || timeZoneId.isEmpty()) { - timeZoneId = readerTimeZone.getID(); - } - - if (!baseTimestampMap.containsKey(timeZoneId)) { - writerTimeZone = TimeZone.getTimeZone(timeZoneId); - hasSameTZRules = writerTimeZone.hasSameRules(readerTimeZone); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - sdf.setTimeZone(writerTimeZone); - try { - long epoch = - sdf.parse(WriterImpl.BASE_TIMESTAMP_STRING).getTime() / WriterImpl.MILLIS_PER_SECOND; - baseTimestampMap.put(timeZoneId, epoch); - return epoch; - } catch (ParseException e) { - throw new IOException("Unable to create base timestamp", e); - } finally { - sdf.setTimeZone(readerTimeZone); - } - } - - return baseTimestampMap.get(timeZoneId); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - data.seek(index); - nanos.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - TimestampWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new TimestampWritable(); - } else { - result = (TimestampWritable) previous; - } - long millis = (data.next() + base_timestamp) * WriterImpl.MILLIS_PER_SECOND; - int newNanos = parseNanos(nanos.next()); - // fix the rounding when we divided by 1000. - if (millis >= 0) { - millis += newNanos / 1000000; - } else { - millis -= newNanos / 1000000; - } - long offset = 0; - // If reader and writer time zones have different rules, adjust the timezone difference - // between reader and writer taking day light savings into account. - if (!hasSameTZRules) { - offset = writerTimeZone.getOffset(millis) - readerTimeZone.getOffset(millis); - } - long adjustedMillis = millis + offset; - Timestamp ts = new Timestamp(adjustedMillis); - // Sometimes the reader timezone might have changed after adding the adjustedMillis. - // To account for that change, check for any difference in reader timezone after - // adding adjustedMillis. If so use the new offset (offset at adjustedMillis point of time). - if (!hasSameTZRules && - (readerTimeZone.getOffset(millis) != readerTimeZone.getOffset(adjustedMillis))) { - long newOffset = - writerTimeZone.getOffset(millis) - readerTimeZone.getOffset(adjustedMillis); - adjustedMillis = millis + newOffset; - ts.setTime(adjustedMillis); - } - ts.setNanos(newNanos); - result.set(ts); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - result.reset(); - Object obj = null; - for (int i = 0; i < batchSize; i++) { - obj = next(obj); - if (obj == null) { - result.noNulls = false; - result.isNull[i] = true; - } else { - TimestampWritable writable = (TimestampWritable) obj; - Timestamp timestamp = writable.getTimestamp(); - result.vector[i] = TimestampUtils.getTimeNanoSec(timestamp); - } - } - - return result; - } - - private static int parseNanos(long serialized) { - int zeros = 7 & (int) serialized; - int result = (int) (serialized >>> 3); - if (zeros != 0) { - for(int i =0; i <= zeros; ++i) { - result *= 10; - } - } - return result; - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - data.skip(items); - nanos.skip(items); - } - } - - public static class DateTreeReader extends TreeReader{ - protected IntegerReader reader = null; - - DateTreeReader(int columnId) throws IOException { - this(columnId, null, null, null); - } - - public DateTreeReader(int columnId, InStream present, InStream data, - OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present); - if (data != null && encoding != null) { - checkEncoding(encoding); - reader = createIntegerReader(encoding.getKind(), data, true, false); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(name), true, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - DateWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new DateWritable(); - } else { - result = (DateWritable) previous; - } - result.set((int) reader.next()); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - LongColumnVector result = null; - if (previousVector == null) { - result = new LongColumnVector(); - } else { - result = (LongColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - reader.nextVector(result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - } - - public static class DecimalTreeReader extends TreeReader{ - protected InStream valueStream; - protected IntegerReader scaleReader = null; - private LongColumnVector scratchScaleVector; - - private final int precision; - private final int scale; - - DecimalTreeReader(int columnId, int precision, int scale) throws IOException { - this(columnId, precision, scale, null, null, null, null); - } - - public DecimalTreeReader(int columnId, int precision, int scale, InStream present, - InStream valueStream, InStream scaleStream, OrcProto.ColumnEncoding encoding) - throws IOException { - super(columnId, present); - this.precision = precision; - this.scale = scale; - this.scratchScaleVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE); - this.valueStream = valueStream; - if (scaleStream != null && encoding != null) { - checkEncoding(encoding); - this.scaleReader = createIntegerReader(encoding.getKind(), scaleStream, true, false); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - valueStream = streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.DATA)); - scaleReader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, OrcProto.Stream.Kind.SECONDARY)), true, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - valueStream.seek(index); - scaleReader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - HiveDecimalWritable result = null; - if (valuePresent) { - if (previous == null) { - result = new HiveDecimalWritable(); - } else { - result = (HiveDecimalWritable) previous; - } - result.set(HiveDecimal.create(SerializationUtils.readBigInteger(valueStream), - (int) scaleReader.next())); - return HiveDecimalUtils.enforcePrecisionScale(result, precision, scale); - } - return null; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - DecimalColumnVector result = null; - if (previousVector == null) { - result = new DecimalColumnVector(precision, scale); - } else { - result = (DecimalColumnVector) previousVector; - } - - // Save the reference for isNull in the scratch vector - boolean [] scratchIsNull = scratchScaleVector.isNull; - - // Read present/isNull stream - super.nextVector(result, batchSize); - - // Read value entries based on isNull entries - if (result.isRepeating) { - if (!result.isNull[0]) { - BigInteger bInt = SerializationUtils.readBigInteger(valueStream); - short scaleInData = (short) scaleReader.next(); - HiveDecimal dec = HiveDecimal.create(bInt, scaleInData); - dec = HiveDecimalUtils.enforcePrecisionScale(dec, precision, scale); - result.set(0, dec); - } - } else { - // result vector has isNull values set, use the same to read scale vector. - scratchScaleVector.isNull = result.isNull; - scaleReader.nextVector(scratchScaleVector, batchSize); - for (int i = 0; i < batchSize; i++) { - if (!result.isNull[i]) { - BigInteger bInt = SerializationUtils.readBigInteger(valueStream); - short scaleInData = (short) scratchScaleVector.vector[i]; - HiveDecimal dec = HiveDecimal.create(bInt, scaleInData); - dec = HiveDecimalUtils.enforcePrecisionScale(dec, precision, scale); - result.set(i, dec); - } - } - } - // Switch back the null vector. - scratchScaleVector.isNull = scratchIsNull; - return result; - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - for(int i=0; i < items; i++) { - SerializationUtils.readBigInteger(valueStream); - } - scaleReader.skip(items); - } - } - - /** - * A tree reader that will read string columns. At the start of the - * stripe, it creates an internal reader based on whether a direct or - * dictionary encoding was used. - */ - public static class StringTreeReader extends TreeReader { - protected TreeReader reader; - - public StringTreeReader(int columnId) throws IOException { - super(columnId); - } - - public StringTreeReader(int columnId, InStream present, InStream data, InStream length, - InStream dictionary, OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present); - if (encoding != null) { - switch (encoding.getKind()) { - case DIRECT: - case DIRECT_V2: - reader = new StringDirectTreeReader(columnId, present, data, length, - encoding.getKind()); - break; - case DICTIONARY: - case DICTIONARY_V2: - reader = new StringDictionaryTreeReader(columnId, present, data, length, dictionary, - encoding); - break; - default: - throw new IllegalArgumentException("Unsupported encoding " + - encoding.getKind()); - } - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - reader.checkEncoding(encoding); - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - // For each stripe, checks the encoding and initializes the appropriate - // reader - switch (stripeFooter.getColumnsList().get(columnId).getKind()) { - case DIRECT: - case DIRECT_V2: - reader = new StringDirectTreeReader(columnId); - break; - case DICTIONARY: - case DICTIONARY_V2: - reader = new StringDictionaryTreeReader(columnId); - break; - default: - throw new IllegalArgumentException("Unsupported encoding " + - stripeFooter.getColumnsList().get(columnId).getKind()); - } - reader.startStripe(streams, stripeFooter); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - reader.seek(index); - } - - @Override - public void seek(PositionProvider index) throws IOException { - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - return reader.next(previous); - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - return reader.nextVector(previousVector, batchSize); - } - - @Override - void skipRows(long items) throws IOException { - reader.skipRows(items); - } - } - - // This class collects together very similar methods for reading an ORC vector of byte arrays and - // creating the BytesColumnVector. - // - public static class BytesColumnVectorUtil { - - private static byte[] commonReadByteArrays(InStream stream, IntegerReader lengths, LongColumnVector scratchlcv, - BytesColumnVector result, long batchSize) throws IOException { - // Read lengths - scratchlcv.isNull = result.isNull; // Notice we are replacing the isNull vector here... - lengths.nextVector(scratchlcv, batchSize); - int totalLength = 0; - if (!scratchlcv.isRepeating) { - for (int i = 0; i < batchSize; i++) { - if (!scratchlcv.isNull[i]) { - totalLength += (int) scratchlcv.vector[i]; - } - } - } else { - if (!scratchlcv.isNull[0]) { - totalLength = (int) (batchSize * scratchlcv.vector[0]); - } - } - - // Read all the strings for this batch - byte[] allBytes = new byte[totalLength]; - int offset = 0; - int len = totalLength; - while (len > 0) { - int bytesRead = stream.read(allBytes, offset, len); - if (bytesRead < 0) { - throw new EOFException("Can't finish byte read of " + len + "/" + totalLength - + " bytes for batchSize " + batchSize + " from [" + stream + "]"); - } - len -= bytesRead; - offset += bytesRead; - } - - return allBytes; - } - - // This method has the common code for reading in bytes into a BytesColumnVector. - public static void readOrcByteArrays(InStream stream, IntegerReader lengths, LongColumnVector scratchlcv, - BytesColumnVector result, long batchSize) throws IOException { - - byte[] allBytes = commonReadByteArrays(stream, lengths, scratchlcv, result, batchSize); - - // Too expensive to figure out 'repeating' by comparisons. - result.isRepeating = false; - int offset = 0; - if (!scratchlcv.isRepeating) { - for (int i = 0; i < batchSize; i++) { - if (!scratchlcv.isNull[i]) { - result.setRef(i, allBytes, offset, (int) scratchlcv.vector[i]); - offset += scratchlcv.vector[i]; - } else { - result.setRef(i, allBytes, 0, 0); - } - } - } else { - for (int i = 0; i < batchSize; i++) { - if (!scratchlcv.isNull[i]) { - result.setRef(i, allBytes, offset, (int) scratchlcv.vector[0]); - offset += scratchlcv.vector[0]; - } else { - result.setRef(i, allBytes, 0, 0); - } - } - } - } - } - - /** - * A reader for string columns that are direct encoded in the current - * stripe. - */ - public static class StringDirectTreeReader extends TreeReader { - public InStream stream; - public IntegerReader lengths; - private final LongColumnVector scratchlcv; - - StringDirectTreeReader(int columnId) throws IOException { - this(columnId, null, null, null, null); - } - - public StringDirectTreeReader(int columnId, InStream present, InStream data, InStream length, - OrcProto.ColumnEncoding.Kind encoding) throws IOException { - super(columnId, present); - this.scratchlcv = new LongColumnVector(); - this.stream = data; - if (length != null && encoding != null) { - this.lengths = createIntegerReader(encoding, length, false, false); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT && - encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DATA); - stream = streams.get(name); - lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, OrcProto.Stream.Kind.LENGTH)), - false, false); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - stream.seek(index); - lengths.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - Text result = null; - if (valuePresent) { - if (previous == null) { - result = new Text(); - } else { - result = (Text) previous; - } - int len = (int) lengths.next(); - int offset = 0; - byte[] bytes = new byte[len]; - while (len > 0) { - int written = stream.read(bytes, offset, len); - if (written < 0) { - throw new EOFException("Can't finish byte read from " + stream); - } - len -= written; - offset += written; - } - result.set(bytes); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - BytesColumnVector result = null; - if (previousVector == null) { - result = new BytesColumnVector(); - } else { - result = (BytesColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - BytesColumnVectorUtil.readOrcByteArrays(stream, lengths, scratchlcv, result, batchSize); - return result; - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - long lengthToSkip = 0; - for(int i=0; i < items; ++i) { - lengthToSkip += lengths.next(); - } - stream.skip(lengthToSkip); - } - } - - /** - * A reader for string columns that are dictionary encoded in the current - * stripe. - */ - public static class StringDictionaryTreeReader extends TreeReader { - private DynamicByteArray dictionaryBuffer; - private int[] dictionaryOffsets; - public IntegerReader reader; - - private byte[] dictionaryBufferInBytesCache = null; - private final LongColumnVector scratchlcv; - - StringDictionaryTreeReader(int columnId) throws IOException { - this(columnId, null, null, null, null, null); - } - - public StringDictionaryTreeReader(int columnId, InStream present, InStream data, - InStream length, InStream dictionary, OrcProto.ColumnEncoding encoding) - throws IOException{ - super(columnId, present); - scratchlcv = new LongColumnVector(); - if (data != null && encoding != null) { - this.reader = createIntegerReader(encoding.getKind(), data, false, false); - } - - if (dictionary != null && encoding != null) { - readDictionaryStream(dictionary); - } - - if (length != null && encoding != null) { - readDictionaryLengthStream(length, encoding); - } - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DICTIONARY && - encoding.getKind() != OrcProto.ColumnEncoding.Kind.DICTIONARY_V2) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - - // read the dictionary blob - StreamName name = new StreamName(columnId, - OrcProto.Stream.Kind.DICTIONARY_DATA); - InStream in = streams.get(name); - readDictionaryStream(in); - - // read the lengths - name = new StreamName(columnId, OrcProto.Stream.Kind.LENGTH); - in = streams.get(name); - readDictionaryLengthStream(in, stripeFooter.getColumnsList().get(columnId)); - - // set up the row reader - name = new StreamName(columnId, OrcProto.Stream.Kind.DATA); - reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(name), false, false); - } - - private void readDictionaryLengthStream(InStream in, OrcProto.ColumnEncoding encoding) - throws IOException { - int dictionarySize = encoding.getDictionarySize(); - if (in != null) { // Guard against empty LENGTH stream. - IntegerReader lenReader = createIntegerReader(encoding.getKind(), in, false, false); - int offset = 0; - if (dictionaryOffsets == null || - dictionaryOffsets.length < dictionarySize + 1) { - dictionaryOffsets = new int[dictionarySize + 1]; - } - for (int i = 0; i < dictionarySize; ++i) { - dictionaryOffsets[i] = offset; - offset += (int) lenReader.next(); - } - dictionaryOffsets[dictionarySize] = offset; - in.close(); - } - - } - - private void readDictionaryStream(InStream in) throws IOException { - if (in != null) { // Guard against empty dictionary stream. - if (in.available() > 0) { - dictionaryBuffer = new DynamicByteArray(64, in.available()); - dictionaryBuffer.readAll(in); - // Since its start of strip invalidate the cache. - dictionaryBufferInBytesCache = null; - } - in.close(); - } else { - dictionaryBuffer = null; - } - } - - @Override - void seek(PositionProvider[] index) throws IOException { - seek(index[columnId]); - } - - @Override - public void seek(PositionProvider index) throws IOException { - super.seek(index); - reader.seek(index); - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - Text result = null; - if (valuePresent) { - int entry = (int) reader.next(); - if (previous == null) { - result = new Text(); - } else { - result = (Text) previous; - } - int offset = dictionaryOffsets[entry]; - int length = getDictionaryEntryLength(entry, offset); - // If the column is just empty strings, the size will be zero, - // so the buffer will be null, in that case just return result - // as it will default to empty - if (dictionaryBuffer != null) { - dictionaryBuffer.setText(result, offset, length); - } else { - result.clear(); - } - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - BytesColumnVector result = null; - int offset = 0, length = 0; - if (previousVector == null) { - result = new BytesColumnVector(); - } else { - result = (BytesColumnVector) previousVector; - } - - // Read present/isNull stream - super.nextVector(result, batchSize); - - if (dictionaryBuffer != null) { - - // Load dictionaryBuffer into cache. - if (dictionaryBufferInBytesCache == null) { - dictionaryBufferInBytesCache = dictionaryBuffer.get(); - } - - // Read string offsets - scratchlcv.isNull = result.isNull; - reader.nextVector(scratchlcv, batchSize); - if (!scratchlcv.isRepeating) { - - // The vector has non-repeating strings. Iterate thru the batch - // and set strings one by one - for (int i = 0; i < batchSize; i++) { - if (!scratchlcv.isNull[i]) { - offset = dictionaryOffsets[(int) scratchlcv.vector[i]]; - length = getDictionaryEntryLength((int) scratchlcv.vector[i], offset); - result.setRef(i, dictionaryBufferInBytesCache, offset, length); - } else { - // If the value is null then set offset and length to zero (null string) - result.setRef(i, dictionaryBufferInBytesCache, 0, 0); - } - } - } else { - // If the value is repeating then just set the first value in the - // vector and set the isRepeating flag to true. No need to iterate thru and - // set all the elements to the same value - offset = dictionaryOffsets[(int) scratchlcv.vector[0]]; - length = getDictionaryEntryLength((int) scratchlcv.vector[0], offset); - result.setRef(0, dictionaryBufferInBytesCache, offset, length); - } - result.isRepeating = scratchlcv.isRepeating; - } else { - // Entire stripe contains null strings. - result.isRepeating = true; - result.noNulls = false; - result.isNull[0] = true; - result.setRef(0, "".getBytes(), 0, 0); - } - return result; - } - - int getDictionaryEntryLength(int entry, int offset) { - int length = 0; - // if it isn't the last entry, subtract the offsets otherwise use - // the buffer length. - if (entry < dictionaryOffsets.length - 1) { - length = dictionaryOffsets[entry + 1] - offset; - } else { - length = dictionaryBuffer.size() - offset; - } - return length; - } - - @Override - void skipRows(long items) throws IOException { - reader.skip(countNonNulls(items)); - } - } - - public static class CharTreeReader extends StringTreeReader { - int maxLength; - - public CharTreeReader(int columnId, int maxLength) throws IOException { - this(columnId, maxLength, null, null, null, null, null); - } - - public CharTreeReader(int columnId, int maxLength, InStream present, InStream data, - InStream length, InStream dictionary, OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, length, dictionary, encoding); - this.maxLength = maxLength; - } - - @Override - Object next(Object previous) throws IOException { - HiveCharWritable result = null; - if (previous == null) { - result = new HiveCharWritable(); - } else { - result = (HiveCharWritable) previous; - } - // Use the string reader implementation to populate the internal Text value - Object textVal = super.next(result.getTextValue()); - if (textVal == null) { - return null; - } - // result should now hold the value that was read in. - // enforce char length - result.enforceMaxLength(maxLength); - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - // Get the vector of strings from StringTreeReader, then make a 2nd pass to - // adjust down the length (right trim and truncate) if necessary. - BytesColumnVector result = (BytesColumnVector) super.nextVector(previousVector, batchSize); - - int adjustedDownLen; - if (result.isRepeating) { - if (result.noNulls || !result.isNull[0]) { - adjustedDownLen = StringExpr.rightTrimAndTruncate(result.vector[0], result.start[0], result.length[0], maxLength); - if (adjustedDownLen < result.length[0]) { - result.setRef(0, result.vector[0], result.start[0], adjustedDownLen); - } - } - } else { - if (result.noNulls){ - for (int i = 0; i < batchSize; i++) { - adjustedDownLen = StringExpr.rightTrimAndTruncate(result.vector[i], result.start[i], result.length[i], maxLength); - if (adjustedDownLen < result.length[i]) { - result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); - } - } - } else { - for (int i = 0; i < batchSize; i++) { - if (!result.isNull[i]) { - adjustedDownLen = StringExpr.rightTrimAndTruncate(result.vector[i], result.start[i], result.length[i], maxLength); - if (adjustedDownLen < result.length[i]) { - result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); - } - } - } - } - } - return result; - } - } - - public static class VarcharTreeReader extends StringTreeReader { - int maxLength; - - public VarcharTreeReader(int columnId, int maxLength) throws IOException { - this(columnId, maxLength, null, null, null, null, null); - } - - public VarcharTreeReader(int columnId, int maxLength, InStream present, InStream data, - InStream length, InStream dictionary, OrcProto.ColumnEncoding encoding) throws IOException { - super(columnId, present, data, length, dictionary, encoding); - this.maxLength = maxLength; - } - - @Override - Object next(Object previous) throws IOException { - HiveVarcharWritable result = null; - if (previous == null) { - result = new HiveVarcharWritable(); - } else { - result = (HiveVarcharWritable) previous; - } - // Use the string reader implementation to populate the internal Text value - Object textVal = super.next(result.getTextValue()); - if (textVal == null) { - return null; - } - // result should now hold the value that was read in. - // enforce varchar length - result.enforceMaxLength(maxLength); - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - // Get the vector of strings from StringTreeReader, then make a 2nd pass to - // adjust down the length (truncate) if necessary. - BytesColumnVector result = (BytesColumnVector) super.nextVector(previousVector, batchSize); - - int adjustedDownLen; - if (result.isRepeating) { - if (result.noNulls || !result.isNull[0]) { - adjustedDownLen = StringExpr.truncate(result.vector[0], result.start[0], result.length[0], maxLength); - if (adjustedDownLen < result.length[0]) { - result.setRef(0, result.vector[0], result.start[0], adjustedDownLen); - } - } - } else { - if (result.noNulls){ - for (int i = 0; i < batchSize; i++) { - adjustedDownLen = StringExpr.truncate(result.vector[i], result.start[i], result.length[i], maxLength); - if (adjustedDownLen < result.length[i]) { - result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); - } - } - } else { - for (int i = 0; i < batchSize; i++) { - if (!result.isNull[i]) { - adjustedDownLen = StringExpr.truncate(result.vector[i], result.start[i], result.length[i], maxLength); - if (adjustedDownLen < result.length[i]) { - result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); - } - } - } - } - } - return result; - } - } - - private static class StructTreeReader extends TreeReader { - private final TreeReader[] fields; - private final String[] fieldNames; - private final List readers; - - StructTreeReader(int columnId, - List types, - boolean[] included, - boolean skipCorrupt) throws IOException { - super(columnId); - OrcProto.Type type = types.get(columnId); - int fieldCount = type.getFieldNamesCount(); - this.fields = new TreeReader[fieldCount]; - this.fieldNames = new String[fieldCount]; - this.readers = new ArrayList(); - for(int i=0; i < fieldCount; ++i) { - int subtype = type.getSubtypes(i); - if (included == null || included[subtype]) { - this.fields[i] = createTreeReader(subtype, types, included, skipCorrupt); - readers.add(this.fields[i]); - } - this.fieldNames[i] = type.getFieldNames(i); - } - } - - @Override - void seek(PositionProvider[] index) throws IOException { - super.seek(index); - for(TreeReader kid: fields) { - if (kid != null) { - kid.seek(index); - } - } - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - OrcStruct result = null; - if (valuePresent) { - if (previous == null) { - result = new OrcStruct(fields.length); - } else { - result = (OrcStruct) previous; - - // If the input format was initialized with a file with a - // different number of fields, the number of fields needs to - // be updated to the correct number - if (result.getNumFields() != fields.length) { - result.setNumFields(fields.length); - } - } - for(int i=0; i < fields.length; ++i) { - if (fields[i] != null) { - result.setFieldValue(i, fields[i].next(result.getFieldValue(i))); - } - } - } - return result; - } - - /** - * @return Total count of non-null field readers. - */ - int getReaderCount() { - return readers.size(); - } - - /** - * @param readerIndex Index among non-null readers. Not a column index! - * @return The readerIndex-s non-null field reader. - */ - TreeReader getColumnReader(int readerIndex) { - return readers.get(readerIndex); - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - ColumnVector[] result = null; - if (previousVector == null) { - result = new ColumnVector[fields.length]; - } else { - result = (ColumnVector[]) previousVector; - } - - // Read all the members of struct as column vectors - for (int i = 0; i < fields.length; i++) { - if (fields[i] != null) { - if (result[i] == null) { - result[i] = (ColumnVector) fields[i].nextVector(null, batchSize); - } else { - fields[i].nextVector(result[i], batchSize); - } - } - } - return result; - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - for(TreeReader field: fields) { - if (field != null) { - field.startStripe(streams, stripeFooter); - } - } - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - for(TreeReader field: fields) { - if (field != null) { - field.skipRows(items); - } - } - } - } - - private static class UnionTreeReader extends TreeReader { - private final TreeReader[] fields; - private RunLengthByteReader tags; - - UnionTreeReader(int columnId, - List types, - boolean[] included, - boolean skipCorrupt) throws IOException { - super(columnId); - OrcProto.Type type = types.get(columnId); - int fieldCount = type.getSubtypesCount(); - this.fields = new TreeReader[fieldCount]; - for(int i=0; i < fieldCount; ++i) { - int subtype = type.getSubtypes(i); - if (included == null || included[subtype]) { - this.fields[i] = createTreeReader(subtype, types, included, skipCorrupt); - } - } - } - - @Override - void seek(PositionProvider[] index) throws IOException { - super.seek(index); - tags.seek(index[columnId]); - for(TreeReader kid: fields) { - kid.seek(index); - } - } - - @Override - Object next(Object previous) throws IOException { - super.next(previous); - OrcUnion result = null; - if (valuePresent) { - if (previous == null) { - result = new OrcUnion(); - } else { - result = (OrcUnion) previous; - } - byte tag = tags.next(); - Object previousVal = result.getObject(); - result.set(tag, fields[tag].next(tag == result.getTag() ? - previousVal : null)); - } - return result; - } - - @Override - public Object nextVector(Object previousVector, long batchSize) throws IOException { - throw new UnsupportedOperationException( - "NextVector is not supported operation for Union type"); - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - tags = new RunLengthByteReader(streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.DATA))); - for(TreeReader field: fields) { - if (field != null) { - field.startStripe(streams, stripeFooter); - } - } - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - long[] counts = new long[fields.length]; - for(int i=0; i < items; ++i) { - counts[tags.next()] += 1; - } - for(int i=0; i < counts.length; ++i) { - fields[i].skipRows(counts[i]); - } - } - } - - private static class ListTreeReader extends TreeReader { - private final TreeReader elementReader; - private IntegerReader lengths = null; - - ListTreeReader(int columnId, - List types, - boolean[] included, - boolean skipCorrupt) throws IOException { - super(columnId); - OrcProto.Type type = types.get(columnId); - elementReader = createTreeReader(type.getSubtypes(0), types, included, skipCorrupt); - } - - @Override - void seek(PositionProvider[] index) throws IOException { - super.seek(index); - lengths.seek(index[columnId]); - elementReader.seek(index); - } - - @Override - @SuppressWarnings("unchecked") - Object next(Object previous) throws IOException { - super.next(previous); - List result = null; - if (valuePresent) { - if (previous == null) { - result = new ArrayList(); - } else { - result = (ArrayList) previous; - } - int prevLength = result.size(); - int length = (int) lengths.next(); - // extend the list to the new length - for(int i=prevLength; i < length; ++i) { - result.add(null); - } - // read the new elements into the array - for(int i=0; i< length; i++) { - result.set(i, elementReader.next(i < prevLength ? - result.get(i) : null)); - } - // remove any extra elements - for(int i=prevLength - 1; i >= length; --i) { - result.remove(i); - } - } - return result; - } - - @Override - public Object nextVector(Object previous, long batchSize) throws IOException { - throw new UnsupportedOperationException( - "NextVector is not supported operation for List type"); - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.LENGTH)), false, false); - if (elementReader != null) { - elementReader.startStripe(streams, stripeFooter); - } - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - long childSkip = 0; - for(long i=0; i < items; ++i) { - childSkip += lengths.next(); - } - elementReader.skipRows(childSkip); - } - } - - private static class MapTreeReader extends TreeReader { - private final TreeReader keyReader; - private final TreeReader valueReader; - private IntegerReader lengths = null; - - MapTreeReader(int columnId, - List types, - boolean[] included, - boolean skipCorrupt) throws IOException { - super(columnId); - OrcProto.Type type = types.get(columnId); - int keyColumn = type.getSubtypes(0); - int valueColumn = type.getSubtypes(1); - if (included == null || included[keyColumn]) { - keyReader = createTreeReader(keyColumn, types, included, skipCorrupt); - } else { - keyReader = null; - } - if (included == null || included[valueColumn]) { - valueReader = createTreeReader(valueColumn, types, included, skipCorrupt); - } else { - valueReader = null; - } - } - - @Override - void seek(PositionProvider[] index) throws IOException { - super.seek(index); - lengths.seek(index[columnId]); - keyReader.seek(index); - valueReader.seek(index); - } - - @Override - @SuppressWarnings("unchecked") - Object next(Object previous) throws IOException { - super.next(previous); - Map result = null; - if (valuePresent) { - if (previous == null) { - result = new LinkedHashMap(); - } else { - result = (LinkedHashMap) previous; - } - // for now just clear and create new objects - result.clear(); - int length = (int) lengths.next(); - // read the new elements into the array - for(int i=0; i< length; i++) { - result.put(keyReader.next(null), valueReader.next(null)); - } - } - return result; - } - - @Override - public Object nextVector(Object previous, long batchSize) throws IOException { - throw new UnsupportedOperationException( - "NextVector is not supported operation for Map type"); - } - - @Override - void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { - if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && - (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { - throw new IOException("Unknown encoding " + encoding + " in column " + - columnId); - } - } - - @Override - void startStripe(Map streams, - OrcProto.StripeFooter stripeFooter - ) throws IOException { - super.startStripe(streams, stripeFooter); - lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), - streams.get(new StreamName(columnId, - OrcProto.Stream.Kind.LENGTH)), false, false); - if (keyReader != null) { - keyReader.startStripe(streams, stripeFooter); - } - if (valueReader != null) { - valueReader.startStripe(streams, stripeFooter); - } - } - - @Override - void skipRows(long items) throws IOException { - items = countNonNulls(items); - long childSkip = 0; - for(long i=0; i < items; ++i) { - childSkip += lengths.next(); - } - keyReader.skipRows(childSkip); - valueReader.skipRows(childSkip); - } - } - - private static TreeReader createTreeReader(int columnId, - List types, - boolean[] included, - boolean skipCorrupt - ) throws IOException { - OrcProto.Type type = types.get(columnId); - switch (type.getKind()) { - case BOOLEAN: - return new BooleanTreeReader(columnId); - case BYTE: - return new ByteTreeReader(columnId); - case DOUBLE: - return new DoubleTreeReader(columnId); - case FLOAT: - return new FloatTreeReader(columnId); - case SHORT: - return new ShortTreeReader(columnId); - case INT: - return new IntTreeReader(columnId); - case LONG: - return new LongTreeReader(columnId, skipCorrupt); - case STRING: - return new StringTreeReader(columnId); - case CHAR: - if (!type.hasMaximumLength()) { - throw new IllegalArgumentException("ORC char type has no length specified"); - } - return new CharTreeReader(columnId, type.getMaximumLength()); - case VARCHAR: - if (!type.hasMaximumLength()) { - throw new IllegalArgumentException("ORC varchar type has no length specified"); - } - return new VarcharTreeReader(columnId, type.getMaximumLength()); - case BINARY: - return new BinaryTreeReader(columnId); - case TIMESTAMP: - return new TimestampTreeReader(columnId, skipCorrupt); - case DATE: - return new DateTreeReader(columnId); - case DECIMAL: - int precision = type.hasPrecision() ? type.getPrecision() : HiveDecimal.SYSTEM_DEFAULT_PRECISION; - int scale = type.hasScale()? type.getScale() : HiveDecimal.SYSTEM_DEFAULT_SCALE; - return new DecimalTreeReader(columnId, precision, scale); - case STRUCT: - return new StructTreeReader(columnId, types, included, skipCorrupt); - case LIST: - return new ListTreeReader(columnId, types, included, skipCorrupt); - case MAP: - return new MapTreeReader(columnId, types, included, skipCorrupt); - case UNION: - return new UnionTreeReader(columnId, types, included, skipCorrupt); - default: - throw new IllegalArgumentException("Unsupported type " + - type.getKind()); - } - } - OrcProto.StripeFooter readStripeFooter(StripeInformation stripe) throws IOException { return metadata.readStripeFooter(stripe); } @@ -2548,10 +240,11 @@ private static TreeReader createTreeReader(int columnId, /** * Given a point and min and max, determine if the point is before, at the * min, in the middle, at the max, or after the range. + * * @param point the point to test - * @param min the minimum point - * @param max the maximum point - * @param the type of the comparision + * @param min the minimum point + * @param max the maximum point + * @param the type of the comparision * @return the location of the point */ static Location compareToRange(Comparable point, T min, T max) { @@ -2572,8 +265,8 @@ private static TreeReader createTreeReader(int columnId, /** * Get the maximum value out of an index entry. - * @param index - * the index entry + * + * @param index the index entry * @return the object for the maximum value or null if there isn't one */ static Object getMax(ColumnStatistics index) { @@ -2590,7 +283,7 @@ static Object getMax(ColumnStatistics index) { } else if (index instanceof TimestampColumnStatistics) { return ((TimestampColumnStatistics) index).getMaximum(); } else if (index instanceof BooleanColumnStatistics) { - if (((BooleanColumnStatistics)index).getTrueCount()!=0) { + if (((BooleanColumnStatistics) index).getTrueCount() != 0) { return "true"; } else { return "false"; @@ -2602,8 +295,8 @@ static Object getMax(ColumnStatistics index) { /** * Get the minimum value out of an index entry. - * @param index - * the index entry + * + * @param index the index entry * @return the object for the minimum value or null if there isn't one */ static Object getMin(ColumnStatistics index) { @@ -2620,7 +313,7 @@ static Object getMin(ColumnStatistics index) { } else if (index instanceof TimestampColumnStatistics) { return ((TimestampColumnStatistics) index).getMinimum(); } else if (index instanceof BooleanColumnStatistics) { - if (((BooleanColumnStatistics)index).getFalseCount()!=0) { + if (((BooleanColumnStatistics) index).getFalseCount() != 0) { return "false"; } else { return "true"; @@ -2633,11 +326,12 @@ static Object getMin(ColumnStatistics index) { /** * Evaluate a predicate with respect to the statistics from the column * that is referenced in the predicate. - * @param statsProto the statistics for the column mentioned in the predicate - * @param predicate the leaf predicate we need to evaluation + * + * @param statsProto the statistics for the column mentioned in the predicate + * @param predicate the leaf predicate we need to evaluation * @param bloomFilter * @return the set of truth values that may be returned for the given - * predicate. + * predicate. */ static TruthValue evaluatePredicateProto(OrcProto.ColumnStatistics statsProto, PredicateLeaf predicate, OrcProto.BloomFilter bloomFilter) { @@ -2654,10 +348,11 @@ static TruthValue evaluatePredicateProto(OrcProto.ColumnStatistics statsProto, /** * Evaluate a predicate with respect to the statistics from the column * that is referenced in the predicate. - * @param stats the statistics for the column mentioned in the predicate + * + * @param stats the statistics for the column mentioned in the predicate * @param predicate the leaf predicate we need to evaluation * @return the set of truth values that may be returned for the given - * predicate. + * predicate. */ static TruthValue evaluatePredicate(ColumnStatistics stats, PredicateLeaf predicate, BloomFilter bloomFilter) { @@ -2906,7 +601,7 @@ private static Object getBaseObjectForComparison(Object predObj, Object statsObj } else if (predObj instanceof String) { return HiveDecimal.create(predObj.toString()); } else if (predObj instanceof BigDecimal) { - return HiveDecimal.create((BigDecimal)predObj); + return HiveDecimal.create((BigDecimal) predObj); } } } @@ -2927,7 +622,7 @@ private static Object getConvertedStatsObj(Object statsObj, Object predObj) { } return statsObj; } - + public static class SargApplier { private final SearchArgument sarg; private final List sargLeaves; @@ -3007,8 +702,9 @@ public SargApplier(SearchArgument sarg, String[] columnNames, long rowIndexStrid /** * Pick the row groups that we need to load from the current stripe. + * * @return an array with a boolean for each row group or null if all of the - * row groups must be read. + * row groups must be read. * @throws IOException */ protected boolean[] pickRowGroups() throws IOException { @@ -3022,14 +718,16 @@ public SargApplier(SearchArgument sarg, String[] columnNames, long rowIndexStrid private void clearStreams() throws IOException { // explicit close of all streams to de-ref ByteBuffers - for(InStream is: streams.values()) { + for (InStream is : streams.values()) { is.close(); } if (bufferChunks != null) { if (zcr != null) { for (DiskRangeList range = bufferChunks; range != null; range = range.next) { - if (!(range instanceof BufferChunk)) continue; - zcr.releaseBuffer(((BufferChunk)range).chunk); + if (!(range instanceof BufferChunk)) { + continue; + } + zcr.releaseBuffer(((BufferChunk) range).chunk); } } bufferChunks = null; @@ -3039,6 +737,7 @@ private void clearStreams() throws IOException { /** * Read the current stripe into memory. + * * @throws IOException */ private void readStripe() throws IOException { @@ -3048,7 +747,7 @@ private void readStripe() throws IOException { // move forward to the first unskipped row if (includedRowGroups != null) { while (rowInStripe < rowCountInStripe && - !includedRowGroups[(int) (rowInStripe / rowIndexStride)]) { + !includedRowGroups[(int) (rowInStripe / rowIndexStride)]) { rowInStripe = Math.min(rowCountInStripe, rowInStripe + rowIndexStride); } } @@ -3077,11 +776,11 @@ private StripeInformation beginReadStripe() throws IOException { rowCountInStripe = stripe.getNumberOfRows(); rowInStripe = 0; rowBaseInStripe = 0; - for(int i=0; i < currentStripe; ++i) { + for (int i = 0; i < currentStripe; ++i) { rowBaseInStripe += stripes.get(i).getNumberOfRows(); } // reset all of the indexes - for(int i=0; i < indexes.length; ++i) { + for (int i = 0; i < indexes.length; ++i) { indexes[i] = null; } return stripe; @@ -3127,8 +826,8 @@ public DiskRange sliceAndShift(long offset, long end, long shiftBy) { assert offset <= end && offset >= this.offset && end <= this.end; assert offset + shiftBy >= 0; ByteBuffer sliceBuf = chunk.slice(); - int newPos = (int)(offset - this.offset); - int newLimit = newPos + (int)(end - offset); + int newPos = (int) (offset - this.offset); + int newLimit = newPos + (int) (end - offset); try { sliceBuf.position(newPos); sliceBuf.limit(newLimit); @@ -3176,26 +875,27 @@ public String toString() { /** * Plan the ranges of the file that we need to read given the list of * columns and row groups. - * @param streamList the list of streams available - * @param indexes the indexes that have been loaded - * @param includedColumns which columns are needed + * + * @param streamList the list of streams available + * @param indexes the indexes that have been loaded + * @param includedColumns which columns are needed * @param includedRowGroups which row groups are needed - * @param isCompressed does the file have generic compression - * @param encodings the encodings for each column - * @param types the types of the columns - * @param compressionSize the compression block size + * @param isCompressed does the file have generic compression + * @param encodings the encodings for each column + * @param types the types of the columns + * @param compressionSize the compression block size * @return the list of disk ranges that will be loaded */ static DiskRangeList planReadPartialDataStreams - (List streamList, - OrcProto.RowIndex[] indexes, - boolean[] includedColumns, - boolean[] includedRowGroups, - boolean isCompressed, - List encodings, - List types, - int compressionSize, - boolean doMergeBuffers) { + (List streamList, + OrcProto.RowIndex[] indexes, + boolean[] includedColumns, + boolean[] includedRowGroups, + boolean isCompressed, + List encodings, + List types, + int compressionSize, + boolean doMergeBuffers) { long offset = 0; // figure out which columns have a present stream boolean[] hasNull = RecordReaderUtils.findPresentStreamsByColumn(streamList, types); @@ -3224,17 +924,17 @@ public String toString() { } void createStreams(List streamDescriptions, - DiskRangeList ranges, - boolean[] includeColumn, - CompressionCodec codec, - int bufferSize, - Map streams) throws IOException { + DiskRangeList ranges, + boolean[] includeColumn, + CompressionCodec codec, + int bufferSize, + Map streams) throws IOException { long streamOffset = 0; - for (OrcProto.Stream streamDesc: streamDescriptions) { + for (OrcProto.Stream streamDesc : streamDescriptions) { int column = streamDesc.getColumn(); if ((includeColumn != null && !includeColumn[column]) || streamDesc.hasKind() && - (StreamName.getArea(streamDesc.getKind()) != StreamName.Area.DATA)) { + (StreamName.getArea(streamDesc.getKind()) != StreamName.Area.DATA)) { streamOffset += streamDesc.getLength(); continue; } @@ -3250,8 +950,8 @@ void createStreams(List streamDescriptions, private void readPartialDataStreams(StripeInformation stripe) throws IOException { List streamList = stripeFooter.getStreamsList(); DiskRangeList toRead = planReadPartialDataStreams(streamList, - indexes, included, includedRowGroups, codec != null, - stripeFooter.getColumnsList(), types, bufferSize, true); + indexes, included, includedRowGroups, codec != null, + stripeFooter.getColumnsList(), types, bufferSize, true); if (LOG.isDebugEnabled()) { LOG.debug("chunks = " + RecordReaderUtils.stringifyDiskRanges(toRead)); } @@ -3270,6 +970,7 @@ public boolean hasNext() throws IOException { /** * Read the next stripe until we find a row that we don't skip. + * * @throws IOException */ private void advanceStripe() throws IOException { @@ -3284,11 +985,13 @@ private void advanceStripe() throws IOException { /** * Skip over rows that we aren't selecting, so that the next row is * one that we will read. + * * @param nextRow the row we want to go to * @throws IOException */ private boolean advanceToNextRow( - TreeReader reader, long nextRow, boolean canAdvanceStripe) throws IOException { + RecordReaderImplFactory.TreeReader reader, long nextRow, boolean canAdvanceStripe) + throws IOException { long nextRowInStripe = nextRow - rowBaseInStripe; // check for row skipping if (rowIndexStride != 0 && @@ -3421,6 +1124,7 @@ public long getRowNumber() { /** * Return the fraction of rows that have been read from the selected. * section of the file + * * @return fraction between 0.0 and 1.0 of rows consumed */ @Override @@ -3429,7 +1133,7 @@ public float getProgress() { } private int findStripe(long rowNumber) { - for(int i=0; i < stripes.size(); i++) { + for (int i = 0; i < stripes.size(); i++) { StripeInformation stripe = stripes.get(i); if (stripe.getNumberOfRows() > rowNumber) { return i; @@ -3460,7 +1164,8 @@ Index readRowIndex(int stripeIndex, boolean[] included, OrcProto.RowIndex[] inde bloomFilterIndex); } - private void seekToRowEntry(TreeReader reader, int rowEntry) throws IOException { + private void seekToRowEntry(RecordReaderImplFactory.TreeReader reader, int rowEntry) + throws IOException { PositionProvider[] index = new PositionProvider[indexes.length]; for (int i = 0; i < indexes.length; ++i) { if (indexes[i] != null) { diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImplFactory.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImplFactory.java new file mode 100644 index 0000000..ff2984a --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/RecordReaderImplFactory.java @@ -0,0 +1,2373 @@ +/** + * 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.io.orc; + +import java.io.EOFException; +import java.io.IOException; +import java.math.BigInteger; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + +import org.apache.hadoop.hive.common.type.HiveDecimal; +import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.DecimalColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.TimestampUtils; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; +import org.apache.hadoop.hive.serde2.io.ByteWritable; +import org.apache.hadoop.hive.serde2.io.DateWritable; +import org.apache.hadoop.hive.serde2.io.DoubleWritable; +import org.apache.hadoop.hive.serde2.io.HiveCharWritable; +import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable; +import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable; +import org.apache.hadoop.hive.serde2.io.ShortWritable; +import org.apache.hadoop.hive.serde2.io.TimestampWritable; +import org.apache.hadoop.hive.serde2.typeinfo.HiveDecimalUtils; +import org.apache.hadoop.io.BooleanWritable; +import org.apache.hadoop.io.BytesWritable; +import org.apache.hadoop.io.FloatWritable; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.LongWritable; +import org.apache.hadoop.io.Text; + +/** + * + */ +public class RecordReaderImplFactory { + + public abstract static class TreeReader { + protected final int columnId; + protected BitFieldReader present = null; + protected boolean valuePresent = false; + protected EncodedColumnBatch.StreamBuffer presentStreamBuffer = null; + protected EncodedColumnBatch.StreamBuffer dataStreamBuffer = null; + protected EncodedColumnBatch.StreamBuffer dictionaryStreamBuffer = null; + protected EncodedColumnBatch.StreamBuffer lengthsStreamBuffer = null; + protected EncodedColumnBatch.StreamBuffer secondaryStreamBuffer = null; + + TreeReader(int columnId) throws IOException { + this(columnId, null); + } + + TreeReader(int columnId, InStream in) throws IOException { + this.columnId = columnId; + if (in == null) { + present = null; + valuePresent = true; + } else { + present = new BitFieldReader(in, 1); + } + } + + public void setBuffers(EncodedColumnBatch.StreamBuffer[] buffers, boolean sameStripe) + throws IOException { + // stream buffers are arranged in enum order of stream kind + for (EncodedColumnBatch.StreamBuffer streamBuffer : buffers) { + switch(streamBuffer.streamKind) { + case 0: + // PRESENT stream + presentStreamBuffer = streamBuffer; + break; + case 1: + // DATA stream + dataStreamBuffer = streamBuffer; + break; + case 2: + // LENGTH stream + lengthsStreamBuffer = streamBuffer; + break; + case 3: + // DICTIONARY_DATA stream + dictionaryStreamBuffer = streamBuffer; + break; + case 5: + // SECONDARY stream + secondaryStreamBuffer = streamBuffer; + break; + default: + throw new IOException("Unexpected stream kind: " + streamBuffer.streamKind); + } + } + } + + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + IntegerReader createIntegerReader(OrcProto.ColumnEncoding.Kind kind, + InStream in, + boolean signed, boolean skipCorrupt) throws IOException { + switch (kind) { + case DIRECT_V2: + case DICTIONARY_V2: + return new RunLengthIntegerReaderV2(in, signed, skipCorrupt); + case DIRECT: + case DICTIONARY: + return new RunLengthIntegerReader(in, signed); + default: + throw new IllegalArgumentException("Unknown encoding " + kind); + } + } + + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + checkEncoding(stripeFooter.getColumnsList().get(columnId)); + InStream in = streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.PRESENT)); + if (in == null) { + present = null; + valuePresent = true; + } else { + present = new BitFieldReader(in, 1); + } + } + + /** + * Seek to the given position. + * + * @param index the indexes loaded from the file + * @throws IOException + */ + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + public void seek(PositionProvider index) throws IOException { + if (present != null) { + present.seek(index); + } + } + + long countNonNulls(long rows) throws IOException { + if (present != null) { + long result = 0; + for (long c = 0; c < rows; ++c) { + if (present.next() == 1) { + result += 1; + } + } + return result; + } else { + return rows; + } + } + + abstract void skipRows(long rows) throws IOException; + + Object next(Object previous) throws IOException { + if (present != null) { + valuePresent = present.next() == 1; + } + return previous; + } + + /** + * Populates the isNull vector array in the previousVector object based on + * the present stream values. This function is called from all the child + * readers, and they all set the values based on isNull field value. + * + * @param previousVector The columnVector object whose isNull value is populated + * @param batchSize Size of the column vector + * @return + * @throws IOException + */ + public Object nextVector(Object previousVector, long batchSize) throws IOException { + ColumnVector result = (ColumnVector) previousVector; + if (present != null) { + // Set noNulls and isNull vector of the ColumnVector based on + // present stream + result.noNulls = true; + for (int i = 0; i < batchSize; i++) { + result.isNull[i] = (present.next() != 1); + if (result.noNulls && result.isNull[i]) { + result.noNulls = false; + } + } + } else { + // There is not present stream, this means that all the values are + // present. + result.noNulls = true; + for (int i = 0; i < batchSize; i++) { + result.isNull[i] = false; + } + } + return previousVector; + } + } + + + protected static class BooleanTreeReader extends TreeReader { + protected BitFieldReader reader = null; + + BooleanTreeReader(int columnId) throws IOException { + this(columnId, null, null); + } + + BooleanTreeReader(int columnId, InStream present, InStream data) throws IOException { + super(columnId, present); + if (data != null) { + reader = new BitFieldReader(data, 1); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + reader = new BitFieldReader(streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.DATA)), 1); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + BooleanWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new BooleanWritable(); + } else { + result = (BooleanWritable) previous; + } + result.set(reader.next() == 1); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + reader.nextVector(result, batchSize); + return result; + } + } + + + protected static class ByteTreeReader extends TreeReader { + protected RunLengthByteReader reader = null; + + ByteTreeReader(int columnId) throws IOException { + this(columnId, null, null); + } + + ByteTreeReader(int columnId, InStream present, InStream data) throws IOException { + super(columnId, present); + this.reader = new RunLengthByteReader(data); + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + reader = new RunLengthByteReader(streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.DATA))); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + ByteWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new ByteWritable(); + } else { + result = (ByteWritable) previous; + } + result.set(reader.next()); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + reader.nextVector(result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + } + + protected static class ShortTreeReader extends TreeReader { + protected IntegerReader reader = null; + + ShortTreeReader(int columnId) throws IOException { + this(columnId, null, null, null); + } + + ShortTreeReader(int columnId, InStream present, InStream data, + OrcProto.ColumnEncoding encoding) + throws IOException { + super(columnId, present); + if (data != null && encoding != null) { + checkEncoding(encoding); + this.reader = createIntegerReader(encoding.getKind(), data, true, false); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(name), true, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + ShortWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new ShortWritable(); + } else { + result = (ShortWritable) previous; + } + result.set((short) reader.next()); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + reader.nextVector(result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + } + + protected static class IntTreeReader extends TreeReader { + protected IntegerReader reader = null; + + IntTreeReader(int columnId) throws IOException { + this(columnId, null, null, null); + } + + IntTreeReader(int columnId, InStream present, InStream data, + OrcProto.ColumnEncoding encoding) + throws IOException { + super(columnId, present); + if (data != null && encoding != null) { + checkEncoding(encoding); + this.reader = createIntegerReader(encoding.getKind(), data, true, false); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + // TODO: stripeFooter.getColumnsList()? + reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(name), true, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + IntWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new IntWritable(); + } else { + result = (IntWritable) previous; + } + result.set((int) reader.next()); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + reader.nextVector(result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + } + + protected static class LongTreeReader extends TreeReader { + protected IntegerReader reader = null; + + LongTreeReader(int columnId, boolean skipCorrupt) throws IOException { + this(columnId, null, null, null, skipCorrupt); + } + + LongTreeReader(int columnId, InStream present, InStream data, + OrcProto.ColumnEncoding encoding, + boolean skipCorrupt) + throws IOException { + super(columnId, present); + if (data != null && encoding != null) { + checkEncoding(encoding); + this.reader = createIntegerReader(encoding.getKind(), data, true, skipCorrupt); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(name), true, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + LongWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new LongWritable(); + } else { + result = (LongWritable) previous; + } + result.set(reader.next()); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + reader.nextVector(result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + } + + protected static class FloatTreeReader extends TreeReader { + protected InStream stream; + private final SerializationUtils utils; + + FloatTreeReader(int columnId) throws IOException { + this(columnId, null, null); + } + + FloatTreeReader(int columnId, InStream present, InStream data) throws IOException { + super(columnId, present); + this.utils = new SerializationUtils(); + this.stream = data; + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + stream = streams.get(name); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + stream.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + FloatWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new FloatWritable(); + } else { + result = (FloatWritable) previous; + } + result.set(utils.readFloat(stream)); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + DoubleColumnVector result = null; + if (previousVector == null) { + result = new DoubleColumnVector(); + } else { + result = (DoubleColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + for (int i = 0; i < batchSize; i++) { + if (!result.isNull[i]) { + result.vector[i] = utils.readFloat(stream); + } else { + + // If the value is not present then set NaN + result.vector[i] = Double.NaN; + } + } + + // Set isRepeating flag + result.isRepeating = true; + for (int i = 0; (i < batchSize - 1 && result.isRepeating); i++) { + if (result.vector[i] != result.vector[i + 1]) { + result.isRepeating = false; + } + } + return result; + } + + @Override + protected void skipRows(long items) throws IOException { + items = countNonNulls(items); + for (int i = 0; i < items; ++i) { + utils.readFloat(stream); + } + } + } + + protected static class DoubleTreeReader extends TreeReader { + protected InStream stream; + private final SerializationUtils utils; + + DoubleTreeReader(int columnId) throws IOException { + this(columnId, null, null); + } + + DoubleTreeReader(int columnId, InStream present, InStream data) throws IOException { + super(columnId, present); + this.utils = new SerializationUtils(); + this.stream = data; + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = + new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + stream = streams.get(name); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + stream.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + DoubleWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new DoubleWritable(); + } else { + result = (DoubleWritable) previous; + } + result.set(utils.readDouble(stream)); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + DoubleColumnVector result = null; + if (previousVector == null) { + result = new DoubleColumnVector(); + } else { + result = (DoubleColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + for (int i = 0; i < batchSize; i++) { + if (!result.isNull[i]) { + result.vector[i] = utils.readDouble(stream); + } else { + // If the value is not present then set NaN + result.vector[i] = Double.NaN; + } + } + + // Set isRepeating flag + result.isRepeating = true; + for (int i = 0; (i < batchSize - 1 && result.isRepeating); i++) { + if (result.vector[i] != result.vector[i + 1]) { + result.isRepeating = false; + } + } + return result; + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + stream.skip(items * 8); + } + } + + + protected static class BinaryTreeReader extends TreeReader { + protected InStream stream; + protected IntegerReader lengths = null; + + protected final LongColumnVector scratchlcv; + + BinaryTreeReader(int columnId) throws IOException { + this(columnId, null, null, null, null); + } + + BinaryTreeReader(int columnId, InStream present, InStream data, InStream length, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present); + scratchlcv = new LongColumnVector(); + this.stream = data; + if (length != null && encoding != null) { + checkEncoding(encoding); + this.lengths = createIntegerReader(encoding.getKind(), length, false, false); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + stream = streams.get(name); + lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, OrcProto.Stream.Kind.LENGTH)), false, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + stream.seek(index); + lengths.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + BytesWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new BytesWritable(); + } else { + result = (BytesWritable) previous; + } + int len = (int) lengths.next(); + result.setSize(len); + int offset = 0; + while (len > 0) { + int written = stream.read(result.getBytes(), offset, len); + if (written < 0) { + throw new EOFException("Can't finish byte read from " + stream); + } + len -= written; + offset += written; + } + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + BytesColumnVector result = null; + if (previousVector == null) { + result = new BytesColumnVector(); + } else { + result = (BytesColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + BytesColumnVectorUtil.readOrcByteArrays(stream, lengths, scratchlcv, result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + long lengthToSkip = 0; + for (int i = 0; i < items; ++i) { + lengthToSkip += lengths.next(); + } + stream.skip(lengthToSkip); + } + } + + protected static class TimestampTreeReader extends TreeReader { + protected IntegerReader data = null; + protected IntegerReader nanos = null; + protected final boolean skipCorrupt; + protected Map baseTimestampMap; + protected long base_timestamp; + protected final TimeZone readerTimeZone; + protected TimeZone writerTimeZone; + protected boolean hasSameTZRules; + + TimestampTreeReader(int columnId, boolean skipCorrupt) throws IOException { + this(columnId, null, null, null, null, skipCorrupt); + } + + TimestampTreeReader(int columnId, InStream presentStream, InStream dataStream, + InStream nanosStream, OrcProto.ColumnEncoding encoding, boolean skipCorrupt) + throws IOException { + super(columnId, presentStream); + this.skipCorrupt = skipCorrupt; + this.baseTimestampMap = new HashMap<>(); + this.readerTimeZone = TimeZone.getDefault(); + this.writerTimeZone = readerTimeZone; + this.hasSameTZRules = writerTimeZone.hasSameRules(readerTimeZone); + this.base_timestamp = getBaseTimestamp(readerTimeZone.getID()); + if (encoding != null) { + checkEncoding(encoding); + + if (dataStream != null) { + this.data = createIntegerReader(encoding.getKind(), dataStream, true, skipCorrupt); + } + + if (nanosStream != null) { + this.nanos = createIntegerReader(encoding.getKind(), nanosStream, false, skipCorrupt); + } + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + data = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.DATA)), true, skipCorrupt); + nanos = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.SECONDARY)), false, skipCorrupt); + base_timestamp = getBaseTimestamp(stripeFooter.getWriterTimezone()); + } + + private long getBaseTimestamp(String timeZoneId) throws IOException { + // to make sure new readers read old files in the same way + if (timeZoneId == null || timeZoneId.isEmpty()) { + timeZoneId = readerTimeZone.getID(); + } + + if (!baseTimestampMap.containsKey(timeZoneId)) { + writerTimeZone = TimeZone.getTimeZone(timeZoneId); + hasSameTZRules = writerTimeZone.hasSameRules(readerTimeZone); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + sdf.setTimeZone(writerTimeZone); + try { + long epoch = + sdf.parse(WriterImpl.BASE_TIMESTAMP_STRING).getTime() / WriterImpl.MILLIS_PER_SECOND; + baseTimestampMap.put(timeZoneId, epoch); + return epoch; + } catch (ParseException e) { + throw new IOException("Unable to create base timestamp", e); + } finally { + sdf.setTimeZone(readerTimeZone); + } + } + + return baseTimestampMap.get(timeZoneId); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + data.seek(index); + nanos.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + TimestampWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new TimestampWritable(); + } else { + result = (TimestampWritable) previous; + } + long millis = (data.next() + base_timestamp) * WriterImpl.MILLIS_PER_SECOND; + int newNanos = parseNanos(nanos.next()); + // fix the rounding when we divided by 1000. + if (millis >= 0) { + millis += newNanos / 1000000; + } else { + millis -= newNanos / 1000000; + } + long offset = 0; + // If reader and writer time zones have different rules, adjust the timezone difference + // between reader and writer taking day light savings into account. + if (!hasSameTZRules) { + offset = writerTimeZone.getOffset(millis) - readerTimeZone.getOffset(millis); + } + long adjustedMillis = millis + offset; + Timestamp ts = new Timestamp(adjustedMillis); + // Sometimes the reader timezone might have changed after adding the adjustedMillis. + // To account for that change, check for any difference in reader timezone after + // adding adjustedMillis. If so use the new offset (offset at adjustedMillis point of time). + if (!hasSameTZRules && + (readerTimeZone.getOffset(millis) != readerTimeZone.getOffset(adjustedMillis))) { + long newOffset = + writerTimeZone.getOffset(millis) - readerTimeZone.getOffset(adjustedMillis); + adjustedMillis = millis + newOffset; + ts.setTime(adjustedMillis); + } + ts.setNanos(newNanos); + result.set(ts); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + result.reset(); + Object obj = null; + for (int i = 0; i < batchSize; i++) { + obj = next(obj); + if (obj == null) { + result.noNulls = false; + result.isNull[i] = true; + } else { + TimestampWritable writable = (TimestampWritable) obj; + Timestamp timestamp = writable.getTimestamp(); + result.vector[i] = TimestampUtils.getTimeNanoSec(timestamp); + } + } + + return result; + } + + private static int parseNanos(long serialized) { + int zeros = 7 & (int) serialized; + int result = (int) (serialized >>> 3); + if (zeros != 0) { + for (int i = 0; i <= zeros; ++i) { + result *= 10; + } + } + return result; + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + data.skip(items); + nanos.skip(items); + } + } + + protected static class DateTreeReader extends TreeReader { + protected IntegerReader reader = null; + + DateTreeReader(int columnId) throws IOException { + this(columnId, null, null, null); + } + + DateTreeReader(int columnId, InStream present, InStream data, + OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present); + if (data != null && encoding != null) { + checkEncoding(encoding); + reader = createIntegerReader(encoding.getKind(), data, true, false); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(name), true, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + DateWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new DateWritable(); + } else { + result = (DateWritable) previous; + } + result.set((int) reader.next()); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + LongColumnVector result = null; + if (previousVector == null) { + result = new LongColumnVector(); + } else { + result = (LongColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + reader.nextVector(result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + } + + protected static class DecimalTreeReader extends TreeReader { + protected InStream valueStream; + protected IntegerReader scaleReader = null; + private LongColumnVector scratchScaleVector; + + private final int precision; + private final int scale; + + DecimalTreeReader(int columnId, int precision, int scale) throws IOException { + this(columnId, precision, scale, null, null, null, null); + } + + DecimalTreeReader(int columnId, int precision, int scale, InStream present, + InStream valueStream, InStream scaleStream, OrcProto.ColumnEncoding encoding) + throws IOException { + super(columnId, present); + this.precision = precision; + this.scale = scale; + this.scratchScaleVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + this.valueStream = valueStream; + if (scaleStream != null && encoding != null) { + checkEncoding(encoding); + this.scaleReader = createIntegerReader(encoding.getKind(), scaleStream, true, false); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + valueStream = streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.DATA)); + scaleReader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, OrcProto.Stream.Kind.SECONDARY)), true, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + valueStream.seek(index); + scaleReader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + HiveDecimalWritable result = null; + if (valuePresent) { + if (previous == null) { + result = new HiveDecimalWritable(); + } else { + result = (HiveDecimalWritable) previous; + } + result.set(HiveDecimal.create(SerializationUtils.readBigInteger(valueStream), + (int) scaleReader.next())); + return HiveDecimalUtils.enforcePrecisionScale(result, precision, scale); + } + return null; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + DecimalColumnVector result = null; + if (previousVector == null) { + result = new DecimalColumnVector(precision, scale); + } else { + result = (DecimalColumnVector) previousVector; + } + + // Save the reference for isNull in the scratch vector + boolean[] scratchIsNull = scratchScaleVector.isNull; + + // Read present/isNull stream + super.nextVector(result, batchSize); + + // Read value entries based on isNull entries + if (result.isRepeating) { + if (!result.isNull[0]) { + BigInteger bInt = SerializationUtils.readBigInteger(valueStream); + short scaleInData = (short) scaleReader.next(); + HiveDecimal dec = HiveDecimal.create(bInt, scaleInData); + dec = HiveDecimalUtils.enforcePrecisionScale(dec, precision, scale); + result.set(0, dec); + } + } else { + // result vector has isNull values set, use the same to read scale vector. + scratchScaleVector.isNull = result.isNull; + scaleReader.nextVector(scratchScaleVector, batchSize); + for (int i = 0; i < batchSize; i++) { + if (!result.isNull[i]) { + BigInteger bInt = SerializationUtils.readBigInteger(valueStream); + short scaleInData = (short) scratchScaleVector.vector[i]; + HiveDecimal dec = HiveDecimal.create(bInt, scaleInData); + dec = HiveDecimalUtils.enforcePrecisionScale(dec, precision, scale); + result.set(i, dec); + } + } + } + // Switch back the null vector. + scratchScaleVector.isNull = scratchIsNull; + return result; + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + for (int i = 0; i < items; i++) { + SerializationUtils.readBigInteger(valueStream); + } + scaleReader.skip(items); + } + } + + /** + * A tree reader that will read string columns. At the start of the + * stripe, it creates an internal reader based on whether a direct or + * dictionary encoding was used. + */ + protected static class StringTreeReader extends TreeReader { + protected TreeReader reader; + + StringTreeReader(int columnId) throws IOException { + super(columnId); + } + + StringTreeReader(int columnId, InStream present, InStream data, InStream length, + InStream dictionary, OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present); + if (encoding != null) { + switch (encoding.getKind()) { + case DIRECT: + case DIRECT_V2: + reader = new StringDirectTreeReader(columnId, present, data, length, + encoding.getKind()); + break; + case DICTIONARY: + case DICTIONARY_V2: + reader = new StringDictionaryTreeReader(columnId, present, data, length, dictionary, + encoding); + break; + default: + throw new IllegalArgumentException("Unsupported encoding " + + encoding.getKind()); + } + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + reader.checkEncoding(encoding); + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + // For each stripe, checks the encoding and initializes the appropriate + // reader + switch (stripeFooter.getColumnsList().get(columnId).getKind()) { + case DIRECT: + case DIRECT_V2: + reader = new StringDirectTreeReader(columnId); + break; + case DICTIONARY: + case DICTIONARY_V2: + reader = new StringDictionaryTreeReader(columnId); + break; + default: + throw new IllegalArgumentException("Unsupported encoding " + + stripeFooter.getColumnsList().get(columnId).getKind()); + } + reader.startStripe(streams, stripeFooter); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + reader.seek(index); + } + + @Override + public void seek(PositionProvider index) throws IOException { + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + return reader.next(previous); + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + return reader.nextVector(previousVector, batchSize); + } + + @Override + void skipRows(long items) throws IOException { + reader.skipRows(items); + } + } + + // This class collects together very similar methods for reading an ORC vector of byte arrays and + // creating the BytesColumnVector. + // + public static class BytesColumnVectorUtil { + + private static byte[] commonReadByteArrays(InStream stream, IntegerReader lengths, + LongColumnVector scratchlcv, + BytesColumnVector result, long batchSize) throws IOException { + // Read lengths + scratchlcv.isNull = result.isNull; // Notice we are replacing the isNull vector here... + lengths.nextVector(scratchlcv, batchSize); + int totalLength = 0; + if (!scratchlcv.isRepeating) { + for (int i = 0; i < batchSize; i++) { + if (!scratchlcv.isNull[i]) { + totalLength += (int) scratchlcv.vector[i]; + } + } + } else { + if (!scratchlcv.isNull[0]) { + totalLength = (int) (batchSize * scratchlcv.vector[0]); + } + } + + // Read all the strings for this batch + byte[] allBytes = new byte[totalLength]; + int offset = 0; + int len = totalLength; + while (len > 0) { + int bytesRead = stream.read(allBytes, offset, len); + if (bytesRead < 0) { + throw new EOFException("Can't finish byte read of " + len + "/" + totalLength + + " bytes for batchSize " + batchSize + " from [" + stream + "]"); + } + len -= bytesRead; + offset += bytesRead; + } + + return allBytes; + } + + // This method has the common code for reading in bytes into a BytesColumnVector. + public static void readOrcByteArrays(InStream stream, IntegerReader lengths, + LongColumnVector scratchlcv, + BytesColumnVector result, long batchSize) throws IOException { + + byte[] allBytes = commonReadByteArrays(stream, lengths, scratchlcv, result, batchSize); + + // Too expensive to figure out 'repeating' by comparisons. + result.isRepeating = false; + int offset = 0; + if (!scratchlcv.isRepeating) { + for (int i = 0; i < batchSize; i++) { + if (!scratchlcv.isNull[i]) { + result.setRef(i, allBytes, offset, (int) scratchlcv.vector[i]); + offset += scratchlcv.vector[i]; + } else { + result.setRef(i, allBytes, 0, 0); + } + } + } else { + for (int i = 0; i < batchSize; i++) { + if (!scratchlcv.isNull[i]) { + result.setRef(i, allBytes, offset, (int) scratchlcv.vector[0]); + offset += scratchlcv.vector[0]; + } else { + result.setRef(i, allBytes, 0, 0); + } + } + } + } + } + + /** + * A reader for string columns that are direct encoded in the current + * stripe. + */ + protected static class StringDirectTreeReader extends TreeReader { + protected InStream stream; + protected IntegerReader lengths; + private final LongColumnVector scratchlcv; + + StringDirectTreeReader(int columnId) throws IOException { + this(columnId, null, null, null, null); + } + + StringDirectTreeReader(int columnId, InStream present, InStream data, InStream length, + OrcProto.ColumnEncoding.Kind encoding) throws IOException { + super(columnId, present); + this.scratchlcv = new LongColumnVector(); + this.stream = data; + if (length != null && encoding != null) { + this.lengths = createIntegerReader(encoding, length, false, false); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT && + encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DATA); + stream = streams.get(name); + lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, OrcProto.Stream.Kind.LENGTH)), + false, false); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + stream.seek(index); + lengths.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + Text result = null; + if (valuePresent) { + if (previous == null) { + result = new Text(); + } else { + result = (Text) previous; + } + int len = (int) lengths.next(); + int offset = 0; + byte[] bytes = new byte[len]; + while (len > 0) { + int written = stream.read(bytes, offset, len); + if (written < 0) { + throw new EOFException("Can't finish byte read from " + stream); + } + len -= written; + offset += written; + } + result.set(bytes); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + BytesColumnVector result = null; + if (previousVector == null) { + result = new BytesColumnVector(); + } else { + result = (BytesColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + BytesColumnVectorUtil.readOrcByteArrays(stream, lengths, scratchlcv, result, batchSize); + return result; + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + long lengthToSkip = 0; + for (int i = 0; i < items; ++i) { + lengthToSkip += lengths.next(); + } + stream.skip(lengthToSkip); + } + } + + /** + * A reader for string columns that are dictionary encoded in the current + * stripe. + */ + protected static class StringDictionaryTreeReader extends TreeReader { + private DynamicByteArray dictionaryBuffer; + private int[] dictionaryOffsets; + protected IntegerReader reader; + + private byte[] dictionaryBufferInBytesCache = null; + private final LongColumnVector scratchlcv; + + StringDictionaryTreeReader(int columnId) throws IOException { + this(columnId, null, null, null, null, null); + } + + StringDictionaryTreeReader(int columnId, InStream present, InStream data, + InStream length, InStream dictionary, OrcProto.ColumnEncoding encoding) + throws IOException { + super(columnId, present); + scratchlcv = new LongColumnVector(); + if (data != null && encoding != null) { + this.reader = createIntegerReader(encoding.getKind(), data, false, false); + } + + if (dictionary != null && encoding != null) { + readDictionaryStream(dictionary); + } + + if (length != null && encoding != null) { + readDictionaryLengthStream(length, encoding); + } + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DICTIONARY && + encoding.getKind() != OrcProto.ColumnEncoding.Kind.DICTIONARY_V2) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + + // read the dictionary blob + StreamName name = new StreamName(columnId, + OrcProto.Stream.Kind.DICTIONARY_DATA); + InStream in = streams.get(name); + readDictionaryStream(in); + + // read the lengths + name = new StreamName(columnId, OrcProto.Stream.Kind.LENGTH); + in = streams.get(name); + readDictionaryLengthStream(in, stripeFooter.getColumnsList().get(columnId)); + + // set up the row reader + name = new StreamName(columnId, OrcProto.Stream.Kind.DATA); + reader = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(name), false, false); + } + + private void readDictionaryLengthStream(InStream in, OrcProto.ColumnEncoding encoding) + throws IOException { + int dictionarySize = encoding.getDictionarySize(); + if (in != null) { // Guard against empty LENGTH stream. + IntegerReader lenReader = createIntegerReader(encoding.getKind(), in, false, false); + int offset = 0; + if (dictionaryOffsets == null || + dictionaryOffsets.length < dictionarySize + 1) { + dictionaryOffsets = new int[dictionarySize + 1]; + } + for (int i = 0; i < dictionarySize; ++i) { + dictionaryOffsets[i] = offset; + offset += (int) lenReader.next(); + } + dictionaryOffsets[dictionarySize] = offset; + in.close(); + } + + } + + private void readDictionaryStream(InStream in) throws IOException { + if (in != null) { // Guard against empty dictionary stream. + if (in.available() > 0) { + dictionaryBuffer = new DynamicByteArray(64, in.available()); + dictionaryBuffer.readAll(in); + // Since its start of strip invalidate the cache. + dictionaryBufferInBytesCache = null; + } + in.close(); + } else { + dictionaryBuffer = null; + } + } + + @Override + void seek(PositionProvider[] index) throws IOException { + seek(index[columnId]); + } + + @Override + public void seek(PositionProvider index) throws IOException { + super.seek(index); + reader.seek(index); + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + Text result = null; + if (valuePresent) { + int entry = (int) reader.next(); + if (previous == null) { + result = new Text(); + } else { + result = (Text) previous; + } + int offset = dictionaryOffsets[entry]; + int length = getDictionaryEntryLength(entry, offset); + // If the column is just empty strings, the size will be zero, + // so the buffer will be null, in that case just return result + // as it will default to empty + if (dictionaryBuffer != null) { + dictionaryBuffer.setText(result, offset, length); + } else { + result.clear(); + } + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + BytesColumnVector result = null; + int offset = 0, length = 0; + if (previousVector == null) { + result = new BytesColumnVector(); + } else { + result = (BytesColumnVector) previousVector; + } + + // Read present/isNull stream + super.nextVector(result, batchSize); + + if (dictionaryBuffer != null) { + + // Load dictionaryBuffer into cache. + if (dictionaryBufferInBytesCache == null) { + dictionaryBufferInBytesCache = dictionaryBuffer.get(); + } + + // Read string offsets + scratchlcv.isNull = result.isNull; + reader.nextVector(scratchlcv, batchSize); + if (!scratchlcv.isRepeating) { + + // The vector has non-repeating strings. Iterate thru the batch + // and set strings one by one + for (int i = 0; i < batchSize; i++) { + if (!scratchlcv.isNull[i]) { + offset = dictionaryOffsets[(int) scratchlcv.vector[i]]; + length = getDictionaryEntryLength((int) scratchlcv.vector[i], offset); + result.setRef(i, dictionaryBufferInBytesCache, offset, length); + } else { + // If the value is null then set offset and length to zero (null string) + result.setRef(i, dictionaryBufferInBytesCache, 0, 0); + } + } + } else { + // If the value is repeating then just set the first value in the + // vector and set the isRepeating flag to true. No need to iterate thru and + // set all the elements to the same value + offset = dictionaryOffsets[(int) scratchlcv.vector[0]]; + length = getDictionaryEntryLength((int) scratchlcv.vector[0], offset); + result.setRef(0, dictionaryBufferInBytesCache, offset, length); + } + result.isRepeating = scratchlcv.isRepeating; + } else { + // Entire stripe contains null strings. + result.isRepeating = true; + result.noNulls = false; + result.isNull[0] = true; + result.setRef(0, "".getBytes(), 0, 0); + } + return result; + } + + int getDictionaryEntryLength(int entry, int offset) { + int length = 0; + // if it isn't the last entry, subtract the offsets otherwise use + // the buffer length. + if (entry < dictionaryOffsets.length - 1) { + length = dictionaryOffsets[entry + 1] - offset; + } else { + length = dictionaryBuffer.size() - offset; + } + return length; + } + + @Override + void skipRows(long items) throws IOException { + reader.skip(countNonNulls(items)); + } + } + + protected static class CharTreeReader extends StringTreeReader { + int maxLength; + + CharTreeReader(int columnId, int maxLength) throws IOException { + this(columnId, maxLength, null, null, null, null, null); + } + + CharTreeReader(int columnId, int maxLength, InStream present, InStream data, + InStream length, InStream dictionary, OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, length, dictionary, encoding); + this.maxLength = maxLength; + } + + @Override + Object next(Object previous) throws IOException { + HiveCharWritable result = null; + if (previous == null) { + result = new HiveCharWritable(); + } else { + result = (HiveCharWritable) previous; + } + // Use the string reader implementation to populate the internal Text value + Object textVal = super.next(result.getTextValue()); + if (textVal == null) { + return null; + } + // result should now hold the value that was read in. + // enforce char length + result.enforceMaxLength(maxLength); + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + // Get the vector of strings from StringTreeReader, then make a 2nd pass to + // adjust down the length (right trim and truncate) if necessary. + BytesColumnVector result = (BytesColumnVector) super.nextVector(previousVector, batchSize); + + int adjustedDownLen; + if (result.isRepeating) { + if (result.noNulls || !result.isNull[0]) { + adjustedDownLen = StringExpr + .rightTrimAndTruncate(result.vector[0], result.start[0], result.length[0], maxLength); + if (adjustedDownLen < result.length[0]) { + result.setRef(0, result.vector[0], result.start[0], adjustedDownLen); + } + } + } else { + if (result.noNulls) { + for (int i = 0; i < batchSize; i++) { + adjustedDownLen = StringExpr + .rightTrimAndTruncate(result.vector[i], result.start[i], result.length[i], + maxLength); + if (adjustedDownLen < result.length[i]) { + result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); + } + } + } else { + for (int i = 0; i < batchSize; i++) { + if (!result.isNull[i]) { + adjustedDownLen = StringExpr + .rightTrimAndTruncate(result.vector[i], result.start[i], result.length[i], + maxLength); + if (adjustedDownLen < result.length[i]) { + result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); + } + } + } + } + } + return result; + } + } + + protected static class VarcharTreeReader extends StringTreeReader { + int maxLength; + + VarcharTreeReader(int columnId, int maxLength) throws IOException { + this(columnId, maxLength, null, null, null, null, null); + } + + VarcharTreeReader(int columnId, int maxLength, InStream present, InStream data, + InStream length, InStream dictionary, OrcProto.ColumnEncoding encoding) throws IOException { + super(columnId, present, data, length, dictionary, encoding); + this.maxLength = maxLength; + } + + @Override + Object next(Object previous) throws IOException { + HiveVarcharWritable result = null; + if (previous == null) { + result = new HiveVarcharWritable(); + } else { + result = (HiveVarcharWritable) previous; + } + // Use the string reader implementation to populate the internal Text value + Object textVal = super.next(result.getTextValue()); + if (textVal == null) { + return null; + } + // result should now hold the value that was read in. + // enforce varchar length + result.enforceMaxLength(maxLength); + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + // Get the vector of strings from StringTreeReader, then make a 2nd pass to + // adjust down the length (truncate) if necessary. + BytesColumnVector result = (BytesColumnVector) super.nextVector(previousVector, batchSize); + + int adjustedDownLen; + if (result.isRepeating) { + if (result.noNulls || !result.isNull[0]) { + adjustedDownLen = StringExpr + .truncate(result.vector[0], result.start[0], result.length[0], maxLength); + if (adjustedDownLen < result.length[0]) { + result.setRef(0, result.vector[0], result.start[0], adjustedDownLen); + } + } + } else { + if (result.noNulls) { + for (int i = 0; i < batchSize; i++) { + adjustedDownLen = StringExpr + .truncate(result.vector[i], result.start[i], result.length[i], maxLength); + if (adjustedDownLen < result.length[i]) { + result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); + } + } + } else { + for (int i = 0; i < batchSize; i++) { + if (!result.isNull[i]) { + adjustedDownLen = StringExpr + .truncate(result.vector[i], result.start[i], result.length[i], maxLength); + if (adjustedDownLen < result.length[i]) { + result.setRef(i, result.vector[i], result.start[i], adjustedDownLen); + } + } + } + } + } + return result; + } + } + + + protected static class StructTreeReader extends TreeReader { + protected final TreeReader[] fields; + protected final String[] fieldNames; + + StructTreeReader(int columnId, + List types, + boolean[] included, + boolean skipCorrupt) throws IOException { + super(columnId); + OrcProto.Type type = types.get(columnId); + int fieldCount = type.getFieldNamesCount(); + this.fields = new TreeReader[fieldCount]; + this.fieldNames = new String[fieldCount]; + for (int i = 0; i < fieldCount; ++i) { + int subtype = type.getSubtypes(i); + if (included == null || included[subtype]) { + this.fields[i] = createTreeReader(subtype, types, included, skipCorrupt); + } + this.fieldNames[i] = type.getFieldNames(i); + } + } + + @Override + void seek(PositionProvider[] index) throws IOException { + super.seek(index); + for (TreeReader kid : fields) { + if (kid != null) { + kid.seek(index); + } + } + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + OrcStruct result = null; + if (valuePresent) { + if (previous == null) { + result = new OrcStruct(fields.length); + } else { + result = (OrcStruct) previous; + + // If the input format was initialized with a file with a + // different number of fields, the number of fields needs to + // be updated to the correct number + if (result.getNumFields() != fields.length) { + result.setNumFields(fields.length); + } + } + for (int i = 0; i < fields.length; ++i) { + if (fields[i] != null) { + result.setFieldValue(i, fields[i].next(result.getFieldValue(i))); + } + } + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + ColumnVector[] result = null; + if (previousVector == null) { + result = new ColumnVector[fields.length]; + } else { + result = (ColumnVector[]) previousVector; + } + + // Read all the members of struct as column vectors + for (int i = 0; i < fields.length; i++) { + if (fields[i] != null) { + if (result[i] == null) { + result[i] = (ColumnVector) fields[i].nextVector(null, batchSize); + } else { + fields[i].nextVector(result[i], batchSize); + } + } + } + return result; + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + for (TreeReader field : fields) { + if (field != null) { + field.startStripe(streams, stripeFooter); + } + } + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + for (TreeReader field : fields) { + if (field != null) { + field.skipRows(items); + } + } + } + } + + protected static class UnionTreeReader extends TreeReader { + protected final TreeReader[] fields; + protected RunLengthByteReader tags; + + UnionTreeReader(int columnId, + List types, + boolean[] included, + boolean skipCorrupt) throws IOException { + super(columnId); + OrcProto.Type type = types.get(columnId); + int fieldCount = type.getSubtypesCount(); + this.fields = new TreeReader[fieldCount]; + for (int i = 0; i < fieldCount; ++i) { + int subtype = type.getSubtypes(i); + if (included == null || included[subtype]) { + this.fields[i] = createTreeReader(subtype, types, included, skipCorrupt); + } + } + } + + @Override + void seek(PositionProvider[] index) throws IOException { + super.seek(index); + tags.seek(index[columnId]); + for (TreeReader kid : fields) { + kid.seek(index); + } + } + + @Override + Object next(Object previous) throws IOException { + super.next(previous); + OrcUnion result = null; + if (valuePresent) { + if (previous == null) { + result = new OrcUnion(); + } else { + result = (OrcUnion) previous; + } + byte tag = tags.next(); + Object previousVal = result.getObject(); + result.set(tag, fields[tag].next(tag == result.getTag() ? + previousVal : null)); + } + return result; + } + + @Override + public Object nextVector(Object previousVector, long batchSize) throws IOException { + throw new UnsupportedOperationException( + "NextVector is not supported operation for Union type"); + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + tags = new RunLengthByteReader(streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.DATA))); + for (TreeReader field : fields) { + if (field != null) { + field.startStripe(streams, stripeFooter); + } + } + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + long[] counts = new long[fields.length]; + for (int i = 0; i < items; ++i) { + counts[tags.next()] += 1; + } + for (int i = 0; i < counts.length; ++i) { + fields[i].skipRows(counts[i]); + } + } + } + + protected static class ListTreeReader extends TreeReader { + protected final TreeReader elementReader; + protected IntegerReader lengths = null; + + ListTreeReader(int columnId, + List types, + boolean[] included, + boolean skipCorrupt) throws IOException { + super(columnId); + OrcProto.Type type = types.get(columnId); + elementReader = createTreeReader(type.getSubtypes(0), types, included, skipCorrupt); + } + + @Override + void seek(PositionProvider[] index) throws IOException { + super.seek(index); + lengths.seek(index[columnId]); + elementReader.seek(index); + } + + @Override + @SuppressWarnings("unchecked") + Object next(Object previous) throws IOException { + super.next(previous); + List result = null; + if (valuePresent) { + if (previous == null) { + result = new ArrayList(); + } else { + result = (ArrayList) previous; + } + int prevLength = result.size(); + int length = (int) lengths.next(); + // extend the list to the new length + for (int i = prevLength; i < length; ++i) { + result.add(null); + } + // read the new elements into the array + for (int i = 0; i < length; i++) { + result.set(i, elementReader.next(i < prevLength ? + result.get(i) : null)); + } + // remove any extra elements + for (int i = prevLength - 1; i >= length; --i) { + result.remove(i); + } + } + return result; + } + + @Override + public Object nextVector(Object previous, long batchSize) throws IOException { + throw new UnsupportedOperationException( + "NextVector is not supported operation for List type"); + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.LENGTH)), false, false); + if (elementReader != null) { + elementReader.startStripe(streams, stripeFooter); + } + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + long childSkip = 0; + for (long i = 0; i < items; ++i) { + childSkip += lengths.next(); + } + elementReader.skipRows(childSkip); + } + } + + protected static class MapTreeReader extends TreeReader { + protected final TreeReader keyReader; + protected final TreeReader valueReader; + protected IntegerReader lengths = null; + + MapTreeReader(int columnId, + List types, + boolean[] included, + boolean skipCorrupt) throws IOException { + super(columnId); + OrcProto.Type type = types.get(columnId); + int keyColumn = type.getSubtypes(0); + int valueColumn = type.getSubtypes(1); + if (included == null || included[keyColumn]) { + keyReader = createTreeReader(keyColumn, types, included, skipCorrupt); + } else { + keyReader = null; + } + if (included == null || included[valueColumn]) { + valueReader = createTreeReader(valueColumn, types, included, skipCorrupt); + } else { + valueReader = null; + } + } + + @Override + void seek(PositionProvider[] index) throws IOException { + super.seek(index); + lengths.seek(index[columnId]); + keyReader.seek(index); + valueReader.seek(index); + } + + @Override + @SuppressWarnings("unchecked") + Object next(Object previous) throws IOException { + super.next(previous); + Map result = null; + if (valuePresent) { + if (previous == null) { + result = new LinkedHashMap(); + } else { + result = (LinkedHashMap) previous; + } + // for now just clear and create new objects + result.clear(); + int length = (int) lengths.next(); + // read the new elements into the array + for (int i = 0; i < length; i++) { + result.put(keyReader.next(null), valueReader.next(null)); + } + } + return result; + } + + @Override + public Object nextVector(Object previous, long batchSize) throws IOException { + throw new UnsupportedOperationException( + "NextVector is not supported operation for Map type"); + } + + @Override + void checkEncoding(OrcProto.ColumnEncoding encoding) throws IOException { + if ((encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT) && + (encoding.getKind() != OrcProto.ColumnEncoding.Kind.DIRECT_V2)) { + throw new IOException("Unknown encoding " + encoding + " in column " + + columnId); + } + } + + @Override + void startStripe(Map streams, + OrcProto.StripeFooter stripeFooter + ) throws IOException { + super.startStripe(streams, stripeFooter); + lengths = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(), + streams.get(new StreamName(columnId, + OrcProto.Stream.Kind.LENGTH)), false, false); + if (keyReader != null) { + keyReader.startStripe(streams, stripeFooter); + } + if (valueReader != null) { + valueReader.startStripe(streams, stripeFooter); + } + } + + @Override + void skipRows(long items) throws IOException { + items = countNonNulls(items); + long childSkip = 0; + for (long i = 0; i < items; ++i) { + childSkip += lengths.next(); + } + keyReader.skipRows(childSkip); + valueReader.skipRows(childSkip); + } + } + + public static TreeReader createTreeReader(int columnId, + List types, + boolean[] included, + boolean skipCorrupt + ) throws IOException { + OrcProto.Type type = types.get(columnId); + switch (type.getKind()) { + case BOOLEAN: + return new BooleanTreeReader(columnId); + case BYTE: + return new ByteTreeReader(columnId); + case DOUBLE: + return new DoubleTreeReader(columnId); + case FLOAT: + return new FloatTreeReader(columnId); + case SHORT: + return new ShortTreeReader(columnId); + case INT: + return new IntTreeReader(columnId); + case LONG: + return new LongTreeReader(columnId, skipCorrupt); + case STRING: + return new StringTreeReader(columnId); + case CHAR: + if (!type.hasMaximumLength()) { + throw new IllegalArgumentException("ORC char type has no length specified"); + } + return new CharTreeReader(columnId, type.getMaximumLength()); + case VARCHAR: + if (!type.hasMaximumLength()) { + throw new IllegalArgumentException("ORC varchar type has no length specified"); + } + return new VarcharTreeReader(columnId, type.getMaximumLength()); + case BINARY: + return new BinaryTreeReader(columnId); + case TIMESTAMP: + return new TimestampTreeReader(columnId, skipCorrupt); + case DATE: + return new DateTreeReader(columnId); + case DECIMAL: + int precision = + type.hasPrecision() ? type.getPrecision() : HiveDecimal.SYSTEM_DEFAULT_PRECISION; + int scale = type.hasScale() ? type.getScale() : HiveDecimal.SYSTEM_DEFAULT_SCALE; + return new DecimalTreeReader(columnId, precision, scale); + case STRUCT: + return new StructTreeReader(columnId, types, included, skipCorrupt); + case LIST: + return new ListTreeReader(columnId, types, included, skipCorrupt); + case MAP: + return new MapTreeReader(columnId, types, included, skipCorrupt); + case UNION: + return new UnionTreeReader(columnId, types, included, skipCorrupt); + default: + throw new IllegalArgumentException("Unsupported type " + + type.getKind()); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/SettableUncompressedStream.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/SettableUncompressedStream.java new file mode 100644 index 0000000..88398bc --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/SettableUncompressedStream.java @@ -0,0 +1,37 @@ +/** + * 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.io.orc; + +import java.util.List; + +import org.apache.hadoop.hive.common.DiskRange; + +/** + * An uncompressed stream whose underlying byte buffer can be set. + */ +public class SettableUncompressedStream extends InStream.UncompressedStream { + + public SettableUncompressedStream(Long fileId, String name, + List input, long length) { + super(fileId, name, input, length); + } + + public void setBuffers(List input, long length) { + reset(input, length); + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/StreamUtils.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/StreamUtils.java new file mode 100644 index 0000000..a456e0d --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/StreamUtils.java @@ -0,0 +1,74 @@ +/** + * 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.io.orc; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.hadoop.hive.common.DiskRange; +import org.apache.hadoop.hive.llap.io.api.EncodedColumnBatch; +import org.apache.hadoop.hive.llap.io.api.cache.LlapMemoryBuffer; + +import com.google.common.collect.Lists; + +/** + * Stream utility. + */ +public class StreamUtils { + + /** + * Create LlapInStream from stream buffer. + * + * @param streamName - stream name + * @param fileId - file id + * @param streamBuffer - stream buffer + * @return - LlapInStream + * @throws IOException + */ + public static SettableUncompressedStream createLlapInStream(String streamName, Long fileId, + EncodedColumnBatch.StreamBuffer streamBuffer) throws IOException { + if (streamBuffer == null) { + return null; + } + + List diskRanges = Lists.newArrayList(); + long totalLength = createDiskRanges(streamBuffer, diskRanges); + return new SettableUncompressedStream(fileId, streamName, diskRanges, totalLength); + } + + /** + * Converts stream buffers to disk ranges. + * @param streamBuffer - stream buffer + * @param diskRanges - initial empty list of disk ranges + * @return - total length of disk ranges + */ + // TODO: unnecessary + public static long createDiskRanges(EncodedColumnBatch.StreamBuffer streamBuffer, + List diskRanges) { + long totalLength = 0; + for (LlapMemoryBuffer memoryBuffer : streamBuffer.cacheBuffers) { + ByteBuffer buffer = memoryBuffer.getByteBufferDup(); + RecordReaderImpl.BufferChunk bufferChunk = new RecordReaderImpl.BufferChunk(buffer, + totalLength); + diskRanges.add(bufferChunk); + totalLength += buffer.remaining(); + } + return totalLength; + } +} diff --git ql/src/test/queries/clientpositive/llap_partitioned.q ql/src/test/queries/clientpositive/llap_partitioned.q index 8bb4211..2e0c07a 100644 --- ql/src/test/queries/clientpositive/llap_partitioned.q +++ ql/src/test/queries/clientpositive/llap_partitioned.q @@ -21,7 +21,8 @@ CREATE TABLE orc_llap_part( cfloat FLOAT, cdouble DOUBLE, cstring1 STRING, - cstring2 STRING, + cchar1 CHAR(255), + cvchar1 VARCHAR(255), cboolean1 BOOLEAN, cboolean2 BOOLEAN ) PARTITIONED BY (ctinyint TINYINT) STORED AS ORC; @@ -33,16 +34,17 @@ CREATE TABLE orc_llap_dim_part( cfloat FLOAT, cdouble DOUBLE, cstring1 STRING, - cstring2 STRING, + cchar1 CHAR(255), + cvchar1 VARCHAR(255), cboolean1 BOOLEAN, cboolean2 BOOLEAN ) PARTITIONED BY (ctinyint TINYINT) STORED AS ORC; INSERT OVERWRITE TABLE orc_llap_part PARTITION (ctinyint) -SELECT csmallint, cint, cbigint, cfloat, cdouble, cstring1, cstring2, cboolean1, cboolean2, ctinyint FROM alltypesorc; +SELECT csmallint, cint, cbigint, cfloat, cdouble, cstring1, cstring1, cstring1, cboolean1, cboolean2, ctinyint FROM alltypesorc; INSERT OVERWRITE TABLE orc_llap_dim_part PARTITION (ctinyint) -SELECT null, null, sum(cbigint) as cbigint, null, null, null, null, null, null, ctinyint FROM alltypesorc WHERE ctinyint > 10 AND ctinyint < 21 GROUP BY ctinyint; +SELECT null, null, sum(cbigint) as cbigint, null, null, null, null, null, null, null, ctinyint FROM alltypesorc WHERE ctinyint > 10 AND ctinyint < 21 GROUP BY ctinyint; drop table llap_temp_table; @@ -51,10 +53,10 @@ SET hive.llap.io.enabled=true; SET hive.vectorized.execution.enabled=true; explain -SELECT oft.ctinyint, oft.cint FROM orc_llap_part oft +SELECT oft.ctinyint, oft.cint, oft.cchar1, oft.cvchar1 FROM orc_llap_part oft INNER JOIN orc_llap_dim_part od ON oft.ctinyint = od.ctinyint; create table llap_temp_table as -SELECT oft.ctinyint, oft.cint FROM orc_llap_part oft +SELECT oft.ctinyint, oft.cint, oft.cchar1, oft.cvchar1 FROM orc_llap_part oft INNER JOIN orc_llap_dim_part od ON oft.ctinyint = od.ctinyint; select sum(hash(*)) from llap_temp_table; drop table llap_temp_table; diff --git ql/src/test/results/clientpositive/llap_partitioned.q.out ql/src/test/results/clientpositive/llap_partitioned.q.out index 8f78f5e..3aefcc5 100644 --- ql/src/test/results/clientpositive/llap_partitioned.q.out +++ ql/src/test/results/clientpositive/llap_partitioned.q.out @@ -13,7 +13,8 @@ PREHOOK: query: CREATE TABLE orc_llap_part( cfloat FLOAT, cdouble DOUBLE, cstring1 STRING, - cstring2 STRING, + cchar1 CHAR(255), + cvchar1 VARCHAR(255), cboolean1 BOOLEAN, cboolean2 BOOLEAN ) PARTITIONED BY (ctinyint TINYINT) STORED AS ORC @@ -27,7 +28,8 @@ POSTHOOK: query: CREATE TABLE orc_llap_part( cfloat FLOAT, cdouble DOUBLE, cstring1 STRING, - cstring2 STRING, + cchar1 CHAR(255), + cvchar1 VARCHAR(255), cboolean1 BOOLEAN, cboolean2 BOOLEAN ) PARTITIONED BY (ctinyint TINYINT) STORED AS ORC @@ -41,7 +43,8 @@ PREHOOK: query: CREATE TABLE orc_llap_dim_part( cfloat FLOAT, cdouble DOUBLE, cstring1 STRING, - cstring2 STRING, + cchar1 CHAR(255), + cvchar1 VARCHAR(255), cboolean1 BOOLEAN, cboolean2 BOOLEAN ) PARTITIONED BY (ctinyint TINYINT) STORED AS ORC @@ -55,7 +58,8 @@ POSTHOOK: query: CREATE TABLE orc_llap_dim_part( cfloat FLOAT, cdouble DOUBLE, cstring1 STRING, - cstring2 STRING, + cchar1 CHAR(255), + cvchar1 VARCHAR(255), cboolean1 BOOLEAN, cboolean2 BOOLEAN ) PARTITIONED BY (ctinyint TINYINT) STORED AS ORC @@ -63,12 +67,12 @@ POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default POSTHOOK: Output: default@orc_llap_dim_part PREHOOK: query: INSERT OVERWRITE TABLE orc_llap_part PARTITION (ctinyint) -SELECT csmallint, cint, cbigint, cfloat, cdouble, cstring1, cstring2, cboolean1, cboolean2, ctinyint FROM alltypesorc +SELECT csmallint, cint, cbigint, cfloat, cdouble, cstring1, cstring1, cstring1, cboolean1, cboolean2, ctinyint FROM alltypesorc PREHOOK: type: QUERY PREHOOK: Input: default@alltypesorc PREHOOK: Output: default@orc_llap_part POSTHOOK: query: INSERT OVERWRITE TABLE orc_llap_part PARTITION (ctinyint) -SELECT csmallint, cint, cbigint, cfloat, cdouble, cstring1, cstring2, cboolean1, cboolean2, ctinyint FROM alltypesorc +SELECT csmallint, cint, cbigint, cfloat, cdouble, cstring1, cstring1, cstring1, cboolean1, cboolean2, ctinyint FROM alltypesorc POSTHOOK: type: QUERY POSTHOOK: Input: default@alltypesorc POSTHOOK: Output: default@orc_llap_part@ctinyint=-1 @@ -202,1162 +206,1290 @@ POSTHOOK: Output: default@orc_llap_part@ctinyint=__HIVE_DEFAULT_PARTITION__ POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-10).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-11).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-12).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-13).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-14).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-15).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-16).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-17).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-18).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-19).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-1).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-20).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-21).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-22).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-23).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-24).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-25).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-26).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-27).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-28).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-29).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-2).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-30).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-31).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-32).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-33).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-34).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-35).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-36).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-37).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-38).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-39).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-3).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-40).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-41).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-42).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-43).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-44).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-45).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-46).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-47).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-48).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-49).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-4).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-50).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-51).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-52).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-53).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-54).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-55).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-56).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-57).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-58).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-59).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-5).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-60).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-61).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-62).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-63).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-64).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-6).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-7).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-8).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=-9).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=0).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=10).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=11).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=12).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=13).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=14).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=15).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=16).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=17).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=18).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=19).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=1).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=20).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=21).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=22).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=23).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=24).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=25).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=26).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=27).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=28).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=29).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=2).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=30).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=31).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=32).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=33).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=34).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=35).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=36).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=37).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=38).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=39).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=3).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=40).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=41).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=42).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=43).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=44).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=45).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=46).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=47).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=48).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=49).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=4).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=50).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=51).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=52).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=53).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=54).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=55).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=56).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=57).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=58).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=59).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=5).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=60).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=61).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=62).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=6).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=7).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=8).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=9).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cbigint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cboolean1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean1, type:boolean, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cboolean2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cboolean2, type:boolean, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cdouble SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cdouble, type:double, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cfloat SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cfloat, type:float, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cint, type:int, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).csmallint SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:csmallint, type:smallint, comment:null), ] POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cstring1 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] -POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cstring2 SIMPLE [(alltypesorc)alltypesorc.FieldSchema(name:cstring2, type:string, comment:null), ] +POSTHOOK: Lineage: orc_llap_part PARTITION(ctinyint=__HIVE_DEFAULT_PARTITION__).cvchar1 EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cstring1, type:string, comment:null), ] PREHOOK: query: INSERT OVERWRITE TABLE orc_llap_dim_part PARTITION (ctinyint) -SELECT null, null, sum(cbigint) as cbigint, null, null, null, null, null, null, ctinyint FROM alltypesorc WHERE ctinyint > 10 AND ctinyint < 21 GROUP BY ctinyint +SELECT null, null, sum(cbigint) as cbigint, null, null, null, null, null, null, null, ctinyint FROM alltypesorc WHERE ctinyint > 10 AND ctinyint < 21 GROUP BY ctinyint PREHOOK: type: QUERY PREHOOK: Input: default@alltypesorc PREHOOK: Output: default@orc_llap_dim_part POSTHOOK: query: INSERT OVERWRITE TABLE orc_llap_dim_part PARTITION (ctinyint) -SELECT null, null, sum(cbigint) as cbigint, null, null, null, null, null, null, ctinyint FROM alltypesorc WHERE ctinyint > 10 AND ctinyint < 21 GROUP BY ctinyint +SELECT null, null, sum(cbigint) as cbigint, null, null, null, null, null, null, null, ctinyint FROM alltypesorc WHERE ctinyint > 10 AND ctinyint < 21 GROUP BY ctinyint POSTHOOK: type: QUERY POSTHOOK: Input: default@alltypesorc POSTHOOK: Output: default@orc_llap_dim_part@ctinyint=11 @@ -1373,103 +1505,113 @@ POSTHOOK: Output: default@orc_llap_dim_part@ctinyint=20 POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=11).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=12).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=13).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=14).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=15).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=16).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=17).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=18).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=19).cvchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cbigint EXPRESSION [(alltypesorc)alltypesorc.FieldSchema(name:cbigint, type:bigint, comment:null), ] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cboolean1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cboolean2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cchar1 EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cdouble EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cfloat EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).csmallint EXPRESSION [] POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cstring1 EXPRESSION [] -POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cstring2 EXPRESSION [] +POSTHOOK: Lineage: orc_llap_dim_part PARTITION(ctinyint=20).cvchar1 EXPRESSION [] PREHOOK: query: drop table llap_temp_table PREHOOK: type: DROPTABLE POSTHOOK: query: drop table llap_temp_table POSTHOOK: type: DROPTABLE PREHOOK: query: explain -SELECT oft.ctinyint, oft.cint FROM orc_llap_part oft +SELECT oft.ctinyint, oft.cint, oft.cchar1, oft.cvchar1 FROM orc_llap_part oft INNER JOIN orc_llap_dim_part od ON oft.ctinyint = od.ctinyint PREHOOK: type: QUERY POSTHOOK: query: explain -SELECT oft.ctinyint, oft.cint FROM orc_llap_part oft +SELECT oft.ctinyint, oft.cint, oft.cchar1, oft.cvchar1 FROM orc_llap_part oft INNER JOIN orc_llap_dim_part od ON oft.ctinyint = od.ctinyint POSTHOOK: type: QUERY STAGE DEPENDENCIES: @@ -1488,7 +1630,7 @@ STAGE PLANS: od TableScan alias: od - Statistics: Num rows: 10 Data size: 1760 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 10 Data size: 2600 Basic stats: COMPLETE Column stats: NONE HashTable Sink Operator keys: 0 ctinyint (type: tinyint) @@ -1499,27 +1641,26 @@ STAGE PLANS: Map Operator Tree: TableScan alias: oft - Statistics: Num rows: 12288 Data size: 2142853 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 12288 Data size: 5231594 Basic stats: COMPLETE Column stats: NONE Map Join Operator condition map: Inner Join 0 to 1 keys: 0 ctinyint (type: tinyint) 1 ctinyint (type: tinyint) - outputColumnNames: _col1, _col9 - Statistics: Num rows: 13516 Data size: 2357138 Basic stats: COMPLETE Column stats: NONE + outputColumnNames: _col1, _col6, _col7, _col10 + Statistics: Num rows: 13516 Data size: 5754753 Basic stats: COMPLETE Column stats: NONE Select Operator - expressions: _col9 (type: tinyint), _col1 (type: int) - outputColumnNames: _col0, _col1 - Statistics: Num rows: 13516 Data size: 2357138 Basic stats: COMPLETE Column stats: NONE + expressions: _col10 (type: tinyint), _col1 (type: int), _col6 (type: char(255)), _col7 (type: varchar(255)) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 13516 Data size: 5754753 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 13516 Data size: 2357138 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 13516 Data size: 5754753 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe - Execution mode: vectorized LLAP IO: all inputs Local Work: Map Reduce Local Work @@ -1531,7 +1672,7 @@ STAGE PLANS: ListSink PREHOOK: query: create table llap_temp_table as -SELECT oft.ctinyint, oft.cint FROM orc_llap_part oft +SELECT oft.ctinyint, oft.cint, oft.cchar1, oft.cvchar1 FROM orc_llap_part oft INNER JOIN orc_llap_dim_part od ON oft.ctinyint = od.ctinyint PREHOOK: type: CREATETABLE_AS_SELECT PREHOOK: Input: default@orc_llap_dim_part @@ -1677,7 +1818,7 @@ PREHOOK: Input: default@orc_llap_part@ctinyint=__HIVE_DEFAULT_PARTITION__ PREHOOK: Output: database:default PREHOOK: Output: default@llap_temp_table POSTHOOK: query: create table llap_temp_table as -SELECT oft.ctinyint, oft.cint FROM orc_llap_part oft +SELECT oft.ctinyint, oft.cint, oft.cchar1, oft.cvchar1 FROM orc_llap_part oft INNER JOIN orc_llap_dim_part od ON oft.ctinyint = od.ctinyint POSTHOOK: type: CREATETABLE_AS_SELECT POSTHOOK: Input: default@orc_llap_dim_part @@ -1830,7 +1971,7 @@ POSTHOOK: query: select sum(hash(*)) from llap_temp_table POSTHOOK: type: QUERY POSTHOOK: Input: default@llap_temp_table #### A masked pattern was here #### -104556509202 +-70090855086 PREHOOK: query: drop table llap_temp_table PREHOOK: type: DROPTABLE PREHOOK: Input: default@llap_temp_table