HIVE-27541: Backport of HIVE-21924, HIVE-22769, HIVE-24224, HIVE-24381, HIVE-21905 to branch-3 (#4524)
* HIVE-21924: Split text files even if header/footer exists (Mustafa Iman, reviewed by Sankar Hariappan)
* HIVE-22769: Incorrect query results and query failure during split generation for compressed text files (Panos G via Ashutosh Chauhan , Mustafa Iman)
* HIVE-24224: Fix skipping header/footer for Hive on Tez on compressed file ( Panos G via Ashutosh Chauhan)s
* HIVE-24381: Compressed text input returns 0 rows if skip header/footer is mentioned (Naresh Panchetty Ramanaiah, reviewed by Panagiotis Garefalakis, Jesus Camacho Rodriguez)
* HIVE-21905: Generics improvement around the FetchOperator class (Ivan Suller via Jesus Camacho Rodriguez)
---------
Co-authored-by: Mustafa Iman <mustafa@cloudera.com>
Co-authored-by: Panos Garefalakis <pgaref@cloudera.com>
Co-authored-by: Naresh P R <prnaresh.naresh@gmail.com>
Co-authored-by: Ivan Suller <isuller@cloudera.com>
Co-authored-by: Vineet Garg <vgarg@apache.org>
Co-authored-by: Mahesh Kumar Behera <mahesh@apache.org>
Co-authored-by: Jason Dere <jdere@hortonworks.com>
---------
Signed-off-by: Sankar Hariappan <sankarh@apache.org>
Closes (#4524)
diff --git a/data/files/compressed_4line_file1.csv b/data/files/compressed_4line_file1.csv
new file mode 100644
index 0000000..efe52db
--- /dev/null
+++ b/data/files/compressed_4line_file1.csv
@@ -0,0 +1,3 @@
+1,2019-12-31
+2,2019-12-31
+3,2019-12-31
diff --git a/data/files/compressed_4line_file1.csv.bz2 b/data/files/compressed_4line_file1.csv.bz2
new file mode 100644
index 0000000..ada697d
--- /dev/null
+++ b/data/files/compressed_4line_file1.csv.bz2
Binary files differ
diff --git a/data/files/compressed_4line_file2.csv b/data/files/compressed_4line_file2.csv
new file mode 100644
index 0000000..629a850
--- /dev/null
+++ b/data/files/compressed_4line_file2.csv
@@ -0,0 +1,3 @@
+1,2019-12-31 00
+2,2019-12-31 01
+3,2019-12-31 02
diff --git a/data/files/compressed_4line_file2.csv.bz2 b/data/files/compressed_4line_file2.csv.bz2
new file mode 100644
index 0000000..4b5353a
--- /dev/null
+++ b/data/files/compressed_4line_file2.csv.bz2
Binary files differ
diff --git a/data/files/header_footer_table_4/0001.txt b/data/files/header_footer_table_4/0001.txt
new file mode 100644
index 0000000..878e3cc
--- /dev/null
+++ b/data/files/header_footer_table_4/0001.txt
@@ -0,0 +1,7 @@
+header_int,header_name,header_choice
+12,alex,daily
+3,barry,yearly
+5,chelsea,monthly
+8,xavier,monthly
+footer_int,footer_name,footer_choice
+footer2_int,footer2_name,footer2_choice
\ No newline at end of file
diff --git a/data/files/header_footer_table_4/0002.txt b/data/files/header_footer_table_4/0002.txt
new file mode 100644
index 0000000..dd27f0e
--- /dev/null
+++ b/data/files/header_footer_table_4/0002.txt
@@ -0,0 +1,7 @@
+header_int,header_name,header_choice
+9,derek,yearly
+11,ethan,monthly
+1,faith,yearly
+21,yves,daily
+footer_int,footer_name,footer_choice
+footer2_int,footer2_name,footer2_choice
\ No newline at end of file
diff --git a/data/files/test.csv.gz b/data/files/test.csv.gz
new file mode 100644
index 0000000..defb4cb
--- /dev/null
+++ b/data/files/test.csv.gz
Binary files differ
diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index 52cde10..dd24b42 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -42,7 +42,9 @@
# NOTE: Add tests to minitez only if it is very
# specific to tez and cannot be added to minillap.
-minitez.query.files.shared=delete_orig_table.q,\
+minitez.query.files.shared=\
+ compressed_skip_header_footer_aggr.q,\
+ delete_orig_table.q,\
orc_merge12.q,\
orc_vectorization_ppd.q,\
topnkey.q,\
@@ -397,6 +399,13 @@
minillap.query.files=acid_bucket_pruning.q,\
bucket5.q,\
bucket6.q,\
+ create_genericudaf.q,\
+ create_udaf.q,\
+ create_view.q,\
+ cte_2.q,\
+ cte_4.q,\
+ cttl.q,\
+ dynamic_partition_pruning_2.q,\
dynamic_semijoin_user_level.q,\
except_distinct.q,\
explainuser_2.q,\
@@ -410,6 +419,9 @@
reduce_deduplicate_distinct.q, \
remote_script.q,\
file_with_header_footer.q,\
+ skip_header_footer_aggr.q,\
+ skip_header_footer_proj.q,\
+ compressed_skip_header_footer_aggr.q,\
external_table_purge.q,\
external_table_with_space_in_location_path.q,\
import_exported_table.q,\
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/LineRrOffsetReader.java b/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/LineRrOffsetReader.java
index 3fc1fa2..a0f949b 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/LineRrOffsetReader.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/LineRrOffsetReader.java
@@ -24,6 +24,7 @@
import org.apache.hadoop.hive.llap.io.api.impl.LlapIoImpl;
import org.apache.hadoop.hive.llap.io.encoded.SerDeEncodedDataReader.ReaderWithOffsets;
import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.LineRecordReader;
final class LineRrOffsetReader extends PassThruOffsetReader {
@@ -43,24 +44,29 @@ final class LineRrOffsetReader extends PassThruOffsetReader {
isCompressedMethod = isCompressedMethodTmp;
}
- static ReaderWithOffsets create(LineRecordReader sourceReader) {
- if (isCompressedMethod == null) return new PassThruOffsetReader(sourceReader);
+ static ReaderWithOffsets create(LineRecordReader sourceReader, JobConf jobConf, int skipHeaderCnt, int skipFooterCnt) {
+ // File not compressed, skipping is already done as part of SkippingTextInputFormat
+ if (isCompressedMethod == null) {
+ return new PassThruOffsetReader(sourceReader, jobConf, 0, 0);
+ }
Boolean isCompressed = null;
try {
isCompressed = (Boolean)isCompressedMethod.invoke(sourceReader);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
LlapIoImpl.LOG.error("Cannot check the reader for compression; offsets not supported", e);
- return new PassThruOffsetReader(sourceReader);
+ return new PassThruOffsetReader(sourceReader, jobConf, 0, 0);
}
if (isCompressed) {
+ // Cannot slice compressed files - do header/footer skipping within the Reader
LlapIoImpl.LOG.info("Reader is compressed; offsets not supported");
- return new PassThruOffsetReader(sourceReader); // Cannot slice compressed files.
+ return new PassThruOffsetReader(sourceReader, jobConf, skipHeaderCnt, skipFooterCnt);
}
- return new LineRrOffsetReader(sourceReader);
+ // For non-compressed Text Files Header/Footer Skipping is already done as part of SkippingTextInputFormat
+ return new LineRrOffsetReader(sourceReader, jobConf);
}
- private LineRrOffsetReader(LineRecordReader sourceReader) {
- super(sourceReader);
+ private LineRrOffsetReader(LineRecordReader sourceReader, JobConf jobConf) {
+ super(sourceReader, jobConf, 0, 0);
this.lrReader = sourceReader;
this.posKey = (LongWritable)key;
}
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/PassThruOffsetReader.java b/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/PassThruOffsetReader.java
index ba2b52d..56faace 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/PassThruOffsetReader.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/PassThruOffsetReader.java
@@ -20,23 +20,79 @@
import java.io.IOException;
import org.apache.hadoop.hive.llap.io.encoded.SerDeEncodedDataReader.ReaderWithOffsets;
+import org.apache.hadoop.hive.ql.exec.FooterBuffer;
+import org.apache.hadoop.hive.ql.exec.Utilities;
import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableComparable;
+import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.RecordReader;
-@SuppressWarnings("rawtypes") class PassThruOffsetReader implements ReaderWithOffsets {
+class PassThruOffsetReader implements ReaderWithOffsets {
protected final RecordReader sourceReader;
protected final Object key;
protected final Writable value;
+ protected final JobConf jobConf;
+ protected final int skipHeaderCnt;
+ protected final int skipFooterCnt;
+ private transient FooterBuffer footerBuffer;
+ private transient boolean initialized = false;
- PassThruOffsetReader(RecordReader sourceReader) {
+ PassThruOffsetReader(RecordReader sourceReader, JobConf jobConf, int headerCnt, int footerCnt) {
this.sourceReader = sourceReader;
- key = sourceReader.createKey();
- value = (Writable)sourceReader.createValue();
+ this.key = sourceReader.createKey();
+ this.value = (Writable)sourceReader.createValue();
+ this.jobConf = jobConf;
+ this.skipHeaderCnt = headerCnt;
+ this.skipFooterCnt = footerCnt;
}
@Override
public boolean next() throws IOException {
- return sourceReader.next(key, value);
+ try {
+ boolean opNotEOF = true;
+ /**
+ * Start reading a new file.
+ * If file contains header, skip header lines before reading the records.
+ * If file contains footer, used FooterBuffer to cache and remove footer
+ * records at the end of the file.
+ */
+ if (!initialized) {
+ // Skip header lines.
+ opNotEOF = Utilities.skipHeader(sourceReader, skipHeaderCnt, key, value);
+
+ // Initialize footer buffer.
+ if (opNotEOF && skipFooterCnt > 0) {
+ footerBuffer = new FooterBuffer();
+ opNotEOF = footerBuffer.initializeBuffer(jobConf, sourceReader, skipFooterCnt, (WritableComparable) key, value);
+ }
+ this.initialized = true;
+ }
+
+ if (opNotEOF && footerBuffer == null) {
+ /**
+ * When file doesn't end after skipping header line
+ * and there is NO footer lines, read normally.
+ */
+ opNotEOF = sourceReader.next(key, value);
+ }
+
+ if (opNotEOF && footerBuffer != null) {
+ /**
+ * When file doesn't end after skipping header line
+ * and there IS footer lines, update footerBuffer
+ */
+ opNotEOF = footerBuffer.updateBuffer(jobConf, sourceReader, (WritableComparable) key, value);
+ }
+
+ if (opNotEOF) {
+ // File reached the end
+ return true;
+ }
+ // Done reading
+ return false;
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
}
@Override
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/SerDeEncodedDataReader.java b/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/SerDeEncodedDataReader.java
index 5b54af5..7f1dac9 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/SerDeEncodedDataReader.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/SerDeEncodedDataReader.java
@@ -58,9 +58,11 @@
import org.apache.hadoop.hive.llap.io.decode.GenericColumnVectorProducer.SerDeStripeMetadata;
import org.apache.hadoop.hive.llap.io.decode.OrcEncodedDataConsumer;
import org.apache.hadoop.hive.llap.io.encoded.VectorDeserializeOrcWriter.AsyncCallback;
+import org.apache.hadoop.hive.ql.exec.Utilities;
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.HdfsUtils;
+import org.apache.hadoop.hive.ql.io.HiveFileFormatUtils;
import org.apache.hadoop.hive.ql.io.orc.OrcFile;
import org.apache.hadoop.hive.ql.io.orc.OrcFile.WriterOptions;
import org.apache.hadoop.hive.ql.io.orc.OrcInputFormat;
@@ -69,6 +71,7 @@
import org.apache.hadoop.hive.ql.io.orc.encoded.CacheChunk;
import org.apache.hadoop.hive.ql.io.orc.encoded.Reader.OrcEncodedColumnBatch;
import org.apache.hadoop.hive.ql.plan.PartitionDesc;
+import org.apache.hadoop.hive.ql.plan.TableDesc;
import org.apache.hadoop.hive.serde2.Deserializer;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
@@ -1392,8 +1395,10 @@ public void startReadSplitFromFile(
ReaderWithOffsets offsetReader = null;
@SuppressWarnings("rawtypes")
RecordReader sourceReader = sourceInputFormat.getRecordReader(split, jobConf, reporter);
+ Path path = split.getPath().getFileSystem(daemonConf).makeQualified(split.getPath());
+ PartitionDesc partDesc = HiveFileFormatUtils.getFromPathRecursively(parts, path, null);
try {
- offsetReader = createOffsetReader(sourceReader);
+ offsetReader = createOffsetReader(sourceReader, partDesc.getTableDesc());
sourceReader = null;
} finally {
if (sourceReader != null) {
@@ -1601,16 +1606,20 @@ private ObjectInspector getOiFromSerDe() throws IOException {
}
}
- private ReaderWithOffsets createOffsetReader(RecordReader<?, ?> sourceReader) {
+ private ReaderWithOffsets createOffsetReader(RecordReader<?, ?> sourceReader, TableDesc tableDesc)
+ throws IOException {
+ int headerCount = Utilities.getHeaderCount(tableDesc);
+ int footerCount = Utilities.getFooterCount(tableDesc, jobConf);
if (LlapIoImpl.LOG.isDebugEnabled()) {
- LlapIoImpl.LOG.debug("Using " + sourceReader.getClass().getSimpleName() + " to read data");
+ LlapIoImpl.LOG.debug("Using {} to read data with skip.header.line.count {} and skip.footer.line.count {}",
+ sourceReader.getClass().getSimpleName(), headerCount, footerCount);
}
// Handle the special cases here. Perhaps we could have a more general structure, or even
// a configurable set (like storage handlers), but for now we only have one.
if (isLrrEnabled && sourceReader instanceof LineRecordReader) {
- return LineRrOffsetReader.create((LineRecordReader)sourceReader);
+ return LineRrOffsetReader.create((LineRecordReader)sourceReader, jobConf, headerCount, footerCount);
}
- return new PassThruOffsetReader(sourceReader);
+ return new PassThruOffsetReader(sourceReader, jobConf, headerCount, footerCount);
}
private static String[] extractHosts(FileSplit split, boolean isInMemory) throws IOException {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java
index 223e52b..e92432f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java
@@ -213,7 +213,6 @@ public void setWork(FetchWork work) {
*/
private static final Map<String, InputFormat> inputFormats = new HashMap<String, InputFormat>();
- @SuppressWarnings("unchecked")
public static InputFormat getInputFormatFromCache(
Class<? extends InputFormat> inputFormatClass, Configuration conf) throws IOException {
if (Configurable.class.isAssignableFrom(inputFormatClass) ||
@@ -311,7 +310,7 @@ static void setFetchOperatorContext(JobConf conf, List<Path> paths) {
private RecordReader<WritableComparable, Writable> getRecordReader() throws Exception {
if (!iterSplits.hasNext()) {
- FetchInputFormatSplit[] splits = getNextSplits();
+ List<FetchInputFormatSplit> splits = getNextSplits();
if (splits == null) {
return null;
}
@@ -327,7 +326,7 @@ private RecordReader<WritableComparable, Writable> getRecordReader() throws Exce
if (isPartitioned) {
row[1] = createPartValue(currDesc, partKeyOI);
}
- iterSplits = Arrays.asList(splits).iterator();
+ iterSplits = splits.iterator();
if (LOG.isDebugEnabled()) {
LOG.debug("Creating fetchTask with deserializer typeinfo: "
@@ -340,7 +339,6 @@ private RecordReader<WritableComparable, Writable> getRecordReader() throws Exce
final FetchInputFormatSplit target = iterSplits.next();
- @SuppressWarnings("unchecked")
final RecordReader<WritableComparable, Writable> reader = target.getRecordReader(job);
if (hasVC || work.getSplitSample() != null) {
currRecReader = new HiveRecordReader<WritableComparable, Writable>(reader, job) {
@@ -366,7 +364,7 @@ public boolean doNext(WritableComparable key, Writable value) throws IOException
return currRecReader;
}
- protected FetchInputFormatSplit[] getNextSplits() throws Exception {
+ private List<FetchInputFormatSplit> getNextSplits() throws Exception {
while (getNextPath()) {
// not using FileInputFormat.setInputPaths() here because it forces a connection to the
// default file system - which may or may not be online during pure metadata operations
@@ -414,7 +412,7 @@ public boolean doNext(WritableComparable key, Writable value) throws IOException
if (HiveConf.getBoolVar(job, HiveConf.ConfVars.HIVE_IN_TEST)) {
Collections.sort(inputSplits, new FetchInputFormatSplitComparator());
}
- return inputSplits.toArray(new FetchInputFormatSplit[inputSplits.size()]);
+ return inputSplits;
}
return null;
@@ -640,7 +638,6 @@ public void closeOperator() throws HiveException {
*/
public void setupContext(List<Path> paths) {
this.iterPath = paths.iterator();
- List<PartitionDesc> partitionDescs;
if (!isPartitioned) {
this.iterPartDesc = Iterators.cycle(new PartitionDesc(work.getTblDesc(), null));
} else {
@@ -666,7 +663,6 @@ private StructObjectInspector setupOutputObjectInspector() throws HiveException
}
partKeyOI = getPartitionKeyOI(tableDesc);
- PartitionDesc partDesc = new PartitionDesc(tableDesc, null);
List<PartitionDesc> listParts = work.getPartDesc();
// Chose the table descriptor if none of the partitions is present.
// For eg: consider the query:
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FooterBuffer.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/FooterBuffer.java
index be88dad0..8ead797 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FooterBuffer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FooterBuffer.java
@@ -29,7 +29,7 @@
import org.apache.hadoop.util.ReflectionUtils;
public class FooterBuffer {
- private ArrayList<ObjectPair> buffer;
+ private ArrayList<ObjectPair<WritableComparable, Writable>> buffer;
private int cur;
public FooterBuffer() {
@@ -64,13 +64,13 @@ public boolean initializeBuffer(JobConf job, RecordReader recordreader,
int footerCount, WritableComparable key, Writable value) throws IOException {
// Fill the buffer with key value pairs.
- this.buffer = new ArrayList<ObjectPair>();
+ this.buffer = new ArrayList<>();
while (buffer.size() < footerCount) {
boolean notEOF = recordreader.next(key, value);
if (!notEOF) {
return false;
}
- ObjectPair tem = new ObjectPair();
+ ObjectPair<WritableComparable, Writable> tem = new ObjectPair<>();
tem.setFirst(ReflectionUtils.copy(job, key, tem.getFirst()));
tem.setSecond(ReflectionUtils.copy(job, value, tem.getSecond()));
buffer.add(tem);
@@ -98,8 +98,8 @@ public boolean initializeBuffer(JobConf job, RecordReader recordreader,
*/
public boolean updateBuffer(JobConf job, RecordReader recordreader,
WritableComparable key, Writable value) throws IOException {
- key = ReflectionUtils.copy(job, (WritableComparable)buffer.get(cur).getFirst(), key);
- value = ReflectionUtils.copy(job, (Writable)buffer.get(cur).getSecond(), value);
+ key = ReflectionUtils.copy(job, buffer.get(cur).getFirst(), key);
+ value = ReflectionUtils.copy(job, buffer.get(cur).getSecond(), value);
boolean notEOF = recordreader.next(buffer.get(cur).getFirst(), buffer.get(cur).getSecond());
if (notEOF) {
cur = (++cur) % buffer.size();
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
index abac436..50f5bcc 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
@@ -189,7 +189,6 @@
import org.apache.hadoop.io.SequenceFile.CompressionType;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
-import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.DefaultCodec;
import org.apache.hadoop.mapred.FileInputFormat;
@@ -3765,8 +3764,8 @@ public static File createTempDir(String baseDir){
* @return Return true if there are 0 or more records left in the file
* after skipping all headers, otherwise return false.
*/
- public static boolean skipHeader(RecordReader<WritableComparable, Writable> currRecReader,
- int headerCount, WritableComparable key, Writable value) throws IOException {
+ public static <K, V> boolean skipHeader(RecordReader<K, V> currRecReader, int headerCount, K key, V value)
+ throws IOException {
while (headerCount > 0) {
if (!currRecReader.next(key, value)) {
return false;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/HiveContextAwareRecordReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/HiveContextAwareRecordReader.java
index a0148f7..17f1ca9 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/io/HiveContextAwareRecordReader.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/HiveContextAwareRecordReader.java
@@ -23,6 +23,7 @@
import java.util.List;
import java.util.Map;
+import org.apache.hadoop.mapred.TextInputFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.hadoop.fs.FileSystem;
@@ -54,7 +55,8 @@
* a binary search to find the block to begin reading from, and stop reading once it can be
* determined no other entries will match the filter.
*/
-public abstract class HiveContextAwareRecordReader<K, V> implements RecordReader<K, V> {
+public abstract class HiveContextAwareRecordReader<K extends WritableComparable, V extends Writable>
+ implements RecordReader<K, V> {
private static final Logger LOG = LoggerFactory.getLogger(HiveContextAwareRecordReader.class.getName());
@@ -68,7 +70,7 @@ public abstract class HiveContextAwareRecordReader<K, V> implements RecordReader
private final List<Comparison> stopComparisons = new ArrayList<Comparison>();
private Map<Path, PartitionDesc> pathToPartitionInfo;
- protected RecordReader recordReader;
+ protected RecordReader<K, V> recordReader;
protected JobConf jobConf;
protected boolean isSorted = false;
@@ -76,17 +78,17 @@ public HiveContextAwareRecordReader(JobConf conf) throws IOException {
this(null, conf);
}
- public HiveContextAwareRecordReader(RecordReader recordReader) {
+ public HiveContextAwareRecordReader(RecordReader<K, V> recordReader) {
this.recordReader = recordReader;
}
- public HiveContextAwareRecordReader(RecordReader recordReader, JobConf conf)
+ public HiveContextAwareRecordReader(RecordReader<K, V> recordReader, JobConf conf)
throws IOException {
this.recordReader = recordReader;
this.jobConf = conf;
}
- public void setRecordReader(RecordReader recordReader) {
+ public void setRecordReader(RecordReader<K, V> recordReader) {
this.recordReader = recordReader;
}
@@ -339,18 +341,20 @@ public boolean doNext(K key, V value) throws IOException {
part = null;
}
TableDesc table = (part == null) ? null : part.getTableDesc();
- if (table != null) {
+ // In TextFormat, skipping is already taken care of as part of SkippingTextInputFormat.
+ // This code will be also called from LLAP when pipeline is non-vectorized and cannot create wrapper.
+ if (table != null && !TextInputFormat.class.isAssignableFrom(part.getInputFileFormatClass())) {
headerCount = Utilities.getHeaderCount(table);
footerCount = Utilities.getFooterCount(table, jobConf);
}
// If input contains header, skip header.
- if (!Utilities.skipHeader(recordReader, headerCount, (WritableComparable)key, (Writable)value)) {
+ if (!Utilities.skipHeader(recordReader, headerCount, key, value)) {
return false;
}
if (footerCount > 0) {
footerBuffer = new FooterBuffer();
- if (!footerBuffer.initializeBuffer(jobConf, recordReader, footerCount, (WritableComparable)key, (Writable)value)) {
+ if (!footerBuffer.initializeBuffer(jobConf, recordReader, footerCount, key, value)) {
return false;
}
}
@@ -360,7 +364,7 @@ public boolean doNext(K key, V value) throws IOException {
// Table files don't have footer rows.
return recordReader.next(key, value);
} else {
- return footerBuffer.updateBuffer(jobConf, recordReader, (WritableComparable)key, (Writable)value);
+ return footerBuffer.updateBuffer(jobConf, recordReader, key, value);
}
} catch (Exception e) {
return HiveIOExceptionHandlerUtil.handleRecordReaderNextException(e, jobConf);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/HiveInputFormat.java b/ql/src/java/org/apache/hadoop/hive/ql/io/HiveInputFormat.java
index f617c3c..899771b 100755
--- a/ql/src/java/org/apache/hadoop/hive/ql/io/HiveInputFormat.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/HiveInputFormat.java
@@ -18,40 +18,22 @@
package org.apache.hadoop.hive.ql.io;
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import org.apache.hadoop.hive.common.FileUtils;
-import org.apache.hadoop.hive.common.StringInternUtils;
-import org.apache.hadoop.hive.common.ValidTxnWriteIdList;
-import org.apache.hadoop.hive.common.ValidWriteIdList;
-import org.apache.hadoop.hive.ql.exec.SerializationUtilities;
-import org.apache.hive.common.util.HiveStringUtils;
-import org.apache.hive.common.util.Ref;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.common.FileUtils;
+import org.apache.hadoop.hive.common.StringInternUtils;
+import org.apache.hadoop.hive.common.ValidTxnWriteIdList;
+import org.apache.hadoop.hive.common.ValidWriteIdList;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil;
import org.apache.hadoop.hive.llap.io.api.LlapIo;
import org.apache.hadoop.hive.llap.io.api.LlapProxy;
import org.apache.hadoop.hive.ql.exec.Operator;
+import org.apache.hadoop.hive.ql.exec.SerializationUtilities;
import org.apache.hadoop.hive.ql.exec.TableScanOperator;
import org.apache.hadoop.hive.ql.exec.Utilities;
import org.apache.hadoop.hive.ql.exec.spark.SparkDynamicPartitionPruner;
@@ -69,6 +51,7 @@
import org.apache.hadoop.hive.serde2.Deserializer;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
+import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapred.InputFormat;
@@ -77,8 +60,27 @@
import org.apache.hadoop.mapred.JobConfigurable;
import org.apache.hadoop.mapred.RecordReader;
import org.apache.hadoop.mapred.Reporter;
+import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.util.StringUtils;
+import org.apache.hive.common.util.HiveStringUtils;
+import org.apache.hive.common.util.Ref;
import org.apache.hive.common.util.ReflectionUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
/**
* HiveInputFormat is a parameterized InputFormat which looks at the path name
@@ -370,7 +372,6 @@ public static InputFormat<WritableComparable, Writable> getInputFormatFromCache(
public RecordReader getRecordReader(InputSplit split, JobConf job,
Reporter reporter) throws IOException {
HiveInputSplit hsplit = (HiveInputSplit) split;
- InputSplit inputSplit = hsplit.getInputSplit();
String inputFormatClassName = null;
Class inputFormatClass = null;
try {
@@ -411,7 +412,8 @@ public RecordReader getRecordReader(InputSplit split, JobConf job,
}
RecordReader innerReader = null;
try {
- innerReader = inputFormat.getRecordReader(inputSplit, job, reporter);
+ // Handle the special header/footer skipping cases here.
+ innerReader = RecordReaderWrapper.create(inputFormat, hsplit, part.getTableDesc(), job, reporter);
} catch (Exception e) {
innerReader = HiveIOExceptionHandlerUtil
.handleRecordReaderCreationException(e, job);
@@ -502,14 +504,19 @@ private void addSplitsForGroup(List<Path> dirs, TableScanOperator tableScan, Job
}
conf.setInputFormat(inputFormat.getClass());
- int headerCount = 0;
- int footerCount = 0;
if (table != null) {
- headerCount = Utilities.getHeaderCount(table);
- footerCount = Utilities.getFooterCount(table, conf);
+ int headerCount = Utilities.getHeaderCount(table);
+ int footerCount = Utilities.getFooterCount(table, conf);
if (headerCount != 0 || footerCount != 0) {
- // Input file has header or footer, cannot be splitted.
- HiveConf.setLongVar(conf, ConfVars.MAPREDMINSPLITSIZE, Long.MAX_VALUE);
+ if (TextInputFormat.class.isAssignableFrom(inputFormatClass) && isUncompressedInput(finalDirs, conf)) {
+ SkippingTextInputFormat skippingTextInputFormat = new SkippingTextInputFormat();
+ skippingTextInputFormat.configure(conf, headerCount, footerCount);
+ inputFormat = skippingTextInputFormat;
+ } else {
+ // if the input is Compressed OR not text we have no way of splitting them!
+ // In that case RecordReader should take care of header/footer skipping!
+ HiveConf.setLongVar(conf, ConfVars.MAPREDMINSPLITSIZE, Long.MAX_VALUE);
+ }
}
}
@@ -568,6 +575,25 @@ protected ValidWriteIdList getMmValidWriteIds(
return validWriteIdList;
}
+ public boolean isUncompressedInput(List<Path> finalPaths, Configuration conf) throws IOException {
+ CompressionCodecFactory compressionCodecs = new CompressionCodecFactory(conf);
+ for (Path curr : finalPaths) {
+ FileSystem fs = curr.getFileSystem(conf);
+ if (fs.isDirectory(curr)) {
+ List<FileStatus> results = new ArrayList<>();
+ FileUtils.listStatusRecursively(fs, fs.getFileStatus(curr), results);
+ for (FileStatus fileStatus : results) {
+ if (compressionCodecs.getCodec(fileStatus.getPath()) != null) {
+ return false;
+ }
+ }
+ } else if (compressionCodecs.getCodec(curr) != null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static void processPathsForMmRead(List<Path> dirs, Configuration conf,
ValidWriteIdList validWriteIdList, List<Path> finalPaths,
List<Path> pathsWithFileOriginals) throws IOException {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/HiveRecordReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/HiveRecordReader.java
index 3864060..359184a 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/io/HiveRecordReader.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/HiveRecordReader.java
@@ -35,12 +35,12 @@ public class HiveRecordReader<K extends WritableComparable, V extends Writable>
- public HiveRecordReader(RecordReader recordReader)
+ public HiveRecordReader(RecordReader<K, V> recordReader)
throws IOException {
super(recordReader);
}
- public HiveRecordReader(RecordReader recordReader, JobConf conf)
+ public HiveRecordReader(RecordReader<K, V> recordReader, JobConf conf)
throws IOException {
super(recordReader, conf);
}
@@ -50,14 +50,17 @@ public void doClose() throws IOException {
recordReader.close();
}
+ @Override
public K createKey() {
- return (K) recordReader.createKey();
+ return recordReader.createKey();
}
+ @Override
public V createValue() {
- return (V) recordReader.createValue();
+ return recordReader.createValue();
}
+ @Override
public long getPos() throws IOException {
return recordReader.getPos();
}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/RecordReaderWrapper.java b/ql/src/java/org/apache/hadoop/hive/ql/io/RecordReaderWrapper.java
new file mode 100644
index 0000000..811c314
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/RecordReaderWrapper.java
@@ -0,0 +1,205 @@
+/*
+ * 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;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hadoop.hive.ql.exec.Utilities;
+import org.apache.hadoop.hive.ql.plan.TableDesc;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableComparable;
+import org.apache.hadoop.mapred.FileSplit;
+import org.apache.hadoop.mapred.InputFormat;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.hadoop.mapred.LineRecordReader;
+import org.apache.hadoop.mapred.RecordReader;
+import org.apache.hadoop.mapred.Reporter;
+import org.apache.hadoop.util.ReflectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+class RecordReaderWrapper extends LineRecordReader {
+ private static final Method isCompressedMethod;
+ private transient boolean initialized = false;
+ protected final JobConf jobConf;
+ protected final int skipHeaderCnt;
+ protected final int skipFooterCnt;
+
+ private List<Pair<WritableComparable, Writable>> footerBuffer;
+ private int cur;
+
+ private static final Logger LOG = LoggerFactory.getLogger(RecordReaderWrapper.class.getName());
+
+ static {
+ Method isCompressedMethodTmp;
+ try {
+ isCompressedMethodTmp = LineRecordReader.class.getDeclaredMethod("isCompressedInput");
+ isCompressedMethodTmp.setAccessible(true);
+ } catch (Throwable t) {
+ isCompressedMethodTmp = null;
+ LOG.warn("Cannot get LineRecordReader isCompressedInput method", t);
+ }
+ isCompressedMethod = isCompressedMethodTmp;
+ }
+
+ static RecordReader create(InputFormat inputFormat, HiveInputFormat.HiveInputSplit split, TableDesc tableDesc,
+ JobConf jobConf, Reporter reporter) throws IOException {
+ int headerCount = Utilities.getHeaderCount(tableDesc);
+ int footerCount = Utilities.getFooterCount(tableDesc, jobConf);
+ RecordReader innerReader = inputFormat.getRecordReader(split.getInputSplit(), jobConf, reporter);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Using {} to read data with skip.header.line.count {} and skip.footer.line.count {}",
+ innerReader.getClass().getSimpleName(), headerCount, footerCount);
+ }
+
+ // For non-compressed Text Files Header/Footer Skipping is already done as part of SkippingTextInputFormat
+ if (innerReader instanceof LineRecordReader) {
+ // File not compressed, skipping is already done as part of SkippingTextInputFormat
+ if (isCompressedMethod == null) {
+ return innerReader;
+ }
+ Boolean isCompressed = null;
+ try {
+ isCompressed = (Boolean) isCompressedMethod.invoke(innerReader);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ LOG.error("Cannot check the reader for compression; offsets not supported", e);
+ return innerReader;
+ }
+ if (isCompressed && (headerCount > 0 || footerCount > 0)) {
+ // Cannot slice compressed files - do header/footer skipping within the Reader
+ LOG.info("Reader is compressed; offsets not supported");
+ return new RecordReaderWrapper(split, jobConf, headerCount, footerCount);
+ }
+ }
+ return innerReader;
+ }
+
+ private RecordReaderWrapper(FileSplit split, JobConf jobConf, int headerCnt, int footerCnt) throws IOException {
+ super(jobConf, split);
+ this.jobConf = jobConf;
+ this.skipHeaderCnt = headerCnt;
+ this.skipFooterCnt = footerCnt;
+ }
+
+ @Override
+ public synchronized boolean next(LongWritable key, Text value) throws IOException {
+ try {
+ boolean opNotEOF = true;
+ /**
+ * Start reading a new file.
+ * If file contains header, skip header lines before reading the records.
+ * If file contains footer, used FooterBuffer to cache and remove footer
+ * records at the end of the file.
+ */
+ if (!initialized) {
+ // Skip header lines.
+ opNotEOF = skipHeader(skipHeaderCnt, key, value);
+
+ // Initialize footer buffer.
+ if (opNotEOF && skipFooterCnt > 0) {
+ opNotEOF = initializeBuffer(jobConf, skipFooterCnt, key, value);
+ }
+ this.initialized = true;
+ }
+
+ if (opNotEOF && footerBuffer == null) {
+ /**
+ * When file doesn't end after skipping header line
+ * and there is NO footer lines, read normally.
+ */
+ opNotEOF = super.next(key, value);
+ }
+
+ if (opNotEOF && footerBuffer != null) {
+ /**
+ * When file doesn't end after skipping header line
+ * and there IS footer lines, update footerBuffer
+ */
+ opNotEOF = updateBuffer(jobConf, key, value);
+ }
+
+ if (opNotEOF) {
+ // File reached the end
+ return true;
+ }
+ // Done reading
+ return false;
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
+ }
+
+ private boolean skipHeader(int headerCount, LongWritable key, Text value) throws IOException {
+ while (headerCount > 0) {
+ if (!super.next(key, value)) {
+ return false;
+ }
+ headerCount--;
+ }
+ return true;
+ }
+
+ public boolean initializeBuffer(JobConf job, int footerCount, LongWritable key, Text value) throws IOException {
+ // Fill the buffer with key value pairs.
+ this.footerBuffer = new ArrayList<>();
+ while (footerBuffer.size() < footerCount) {
+ boolean notEOF = super.next(key, value);
+ if (!notEOF) {
+ return false;
+ }
+ WritableComparable left = ReflectionUtils.copy(job, key, null);
+ Writable right = ReflectionUtils.copy(job, value, null);
+ Pair<WritableComparable, Writable> tem = Pair.of(left, right);
+ footerBuffer.add(tem);
+ }
+ this.cur = 0;
+ return true;
+ }
+
+ /**
+ * Enqueue most recent record read, and dequeue earliest result in the queue.
+ *
+ * @param job
+ * Current job configuration.
+ * @param key
+ * Key of current reading record.
+ *
+ * @param value
+ * Value of current reading record.
+ *
+ * @return Return false if reaches the end of file, otherwise return true.
+ */
+ public boolean updateBuffer(JobConf job, WritableComparable key, Writable value) throws IOException {
+ key = ReflectionUtils.copy(job, footerBuffer.get(cur).getKey(), key);
+ value = ReflectionUtils.copy(job, footerBuffer.get(cur).getValue(), value);
+ boolean notEOF = super.next((LongWritable) footerBuffer.get(cur).getKey(), (Text) footerBuffer.get(cur).getValue());
+ if (notEOF) {
+ cur = (++cur) % footerBuffer.size();
+ }
+ return notEOF;
+ }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/SkippingTextInputFormat.java b/ql/src/java/org/apache/hadoop/hive/ql/io/SkippingTextInputFormat.java
new file mode 100644
index 0000000..7427aea
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/SkippingTextInputFormat.java
@@ -0,0 +1,227 @@
+/*
+ * 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;
+
+import org.apache.hadoop.fs.FSDataInputStream;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.compress.CompressionCodecFactory;
+import org.apache.hadoop.mapred.FileSplit;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.hadoop.mapred.TextInputFormat;
+
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * SkippingInputFormat is a header/footer aware input format. It truncates
+ * splits identified by TextInputFormat. Header and footers are removed
+ * from the splits.
+ *
+ * This InputFormat does NOT support Compressed Files!
+ */
+public class SkippingTextInputFormat extends TextInputFormat {
+
+ private final Map<Path, Long> startIndexMap = new ConcurrentHashMap<>();
+ private final Map<Path, Long> endIndexMap = new ConcurrentHashMap<>();
+ private JobConf conf;
+ private int headerCount;
+ private int footerCount;
+
+ @Override
+ public void configure(JobConf conf) {
+ this.conf = conf;
+ super.configure(conf);
+ }
+
+ public void configure(JobConf conf, int headerCount, int footerCount) {
+ configure(conf);
+ this.headerCount = headerCount;
+ this.footerCount = footerCount;
+ }
+
+ @Override
+ protected FileSplit makeSplit(Path file, long start, long length, String[] hosts) {
+ return makeSplitInternal(file, start, length, hosts, null);
+ }
+
+ @Override
+ protected FileSplit makeSplit(Path file, long start, long length, String[] hosts, String[] inMemoryHosts) {
+ return makeSplitInternal(file, start, length, hosts, inMemoryHosts);
+ }
+
+ private FileSplit makeSplitInternal(Path file, long start, long length, String[] hosts, String[] inMemoryHosts) {
+ long cachedStart;
+ long cachedEnd;
+ try {
+ cachedStart = getCachedStartIndex(file);
+ cachedEnd = getCachedEndIndex(file);
+ } catch (IOException e) {
+ LOG.warn("Could not detect header/footer", e);
+ return new NullRowsInputFormat.DummyInputSplit(file);
+ }
+ if (cachedStart > start + length) {
+ return new NullRowsInputFormat.DummyInputSplit(file);
+ }
+ if (cachedStart > start) {
+ length = length - (cachedStart - start);
+ start = cachedStart;
+ }
+ if (cachedEnd < start) {
+ return new NullRowsInputFormat.DummyInputSplit(file);
+ }
+ if (cachedEnd < start + length) {
+ length = cachedEnd - start;
+ }
+ if (inMemoryHosts == null) {
+ return super.makeSplit(file, start, length, hosts);
+ } else {
+ return super.makeSplit(file, start, length, hosts, inMemoryHosts);
+ }
+ }
+
+ private long getCachedStartIndex(Path path) throws IOException {
+ if (headerCount == 0) {
+ return 0;
+ }
+ Long startIndexForFile = startIndexMap.get(path);
+ if (startIndexForFile == null) {
+ FileSystem fileSystem;
+ FSDataInputStream fis = null;
+ fileSystem = path.getFileSystem(conf);
+ try {
+ fis = fileSystem.open(path);
+ for (int j = 0; j < headerCount; j++) {
+ if (fis.readLine() == null) {
+ startIndexMap.put(path, Long.MAX_VALUE);
+ return Long.MAX_VALUE;
+ }
+ }
+ // Readers skip the entire first row if the start index of the
+ // split is not zero. We are setting the start of the index as
+ // the last byte of the previous row so the last line of header
+ // is discarded instead of the first valid input row.
+ startIndexForFile = fis.getPos() - 1;
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
+ startIndexMap.put(path, startIndexForFile);
+ }
+ return startIndexForFile;
+ }
+
+ private long getCachedEndIndex(Path path) throws IOException {
+ Long endIndexForFile = endIndexMap.get(path);
+ if (endIndexForFile == null) {
+ final long bufferSectionSize = 5 * 1024;
+ FileSystem fileSystem = path.getFileSystem(conf);
+ long endOfFile = fileSystem.getFileStatus(path).getLen();
+ if (footerCount == 0) {
+ endIndexForFile = endOfFile;
+ } else {
+ long bufferSectionEnd = endOfFile; // first byte that is not included in the section
+ long bufferSectionStart = Math.max(0, bufferSectionEnd - bufferSectionSize);
+
+ // we need 'footer count' lines and one space for EOF
+ LineBuffer buffer = new LineBuffer(footerCount + 1);
+ FSDataInputStream fis = null;
+ try {
+ fis = fileSystem.open(path);
+ while (bufferSectionEnd > bufferSectionStart) {
+ fis.seek(bufferSectionStart);
+ long pos = fis.getPos();
+ while (pos < bufferSectionEnd) {
+ if (fis.readLine() == null) {
+ // if there is not enough lines in this section, check the previous
+ // section. If this is the beginning section, there are simply not
+ // enough lines in the file.
+ break;
+ }
+ pos = fis.getPos();
+ buffer.consume(pos, bufferSectionEnd);
+ }
+ if (buffer.getRemainingLineCount() == 0) {
+ // if we consumed all the required line ends, that means the buffer now
+ // contains the index of the first byte of the footer.
+ break;
+ } else {
+ bufferSectionEnd = bufferSectionStart;
+ bufferSectionStart = Math.max(0, bufferSectionEnd - bufferSectionSize);
+ }
+ }
+ if (buffer.getRemainingLineCount() == 0) {
+ // buffer.getFirstLineStart() is the first byte of the footer. So the split
+ // must end before this.
+ endIndexForFile = buffer.getFirstLineStart() - 1;
+ } else {
+ // there were not enough lines in the file to consume all footer rows.
+ endIndexForFile = Long.MIN_VALUE;
+ }
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
+ }
+ endIndexMap.put(path, endIndexForFile);
+ }
+ return endIndexForFile;
+ }
+
+ static class LineBuffer {
+ private final Queue<Long> queue = new ArrayDeque<Long>();
+ private int remainingLineEnds;
+ private long lowPosition = Long.MAX_VALUE;
+
+ LineBuffer(int requiredLines) {
+ this.remainingLineEnds = requiredLines;
+ }
+
+ public void consume(long position, long sectionEnd) {
+ if (position > sectionEnd) {
+ return;
+ }
+ if (position < lowPosition) {
+ remainingLineEnds -= queue.size();
+ queue.clear();
+ queue.add(position);
+ lowPosition = position;
+ } else if (position > lowPosition) {
+ if (queue.size() == remainingLineEnds) {
+ queue.poll();
+ }
+ queue.add(position);
+ lowPosition = queue.peek();
+ }
+ }
+
+ public int getRemainingLineCount() {
+ return remainingLineEnds - queue.size();
+ }
+
+ public long getFirstLineStart() {
+ return lowPosition;
+ }
+ }
+}
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/TestHiveBinarySearchRecordReader.java b/ql/src/test/org/apache/hadoop/hive/ql/io/TestHiveBinarySearchRecordReader.java
index 2a47abf..73a3728 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/io/TestHiveBinarySearchRecordReader.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/io/TestHiveBinarySearchRecordReader.java
@@ -59,7 +59,7 @@ public class TestHiveBinarySearchRecordReader extends TestCase {
private RCFileRecordReader rcfReader;
private JobConf conf;
private TestHiveInputSplit hiveSplit;
- private HiveContextAwareRecordReader hbsReader;
+ private HiveContextAwareRecordReader<WritableComparable, Writable> hbsReader;
private IOContext ioContext;
private static class TestHiveInputSplit extends HiveInputSplit {
@@ -148,52 +148,52 @@ private void init() throws IOException {
hbsReader.initIOContext(hiveSplit, conf, Class.class, rcfReader);
}
- private boolean executeDoNext(HiveContextAwareRecordReader hbsReader) throws IOException {
+ private boolean executeDoNext() throws IOException {
return hbsReader.next(hbsReader.createKey(), hbsReader.createValue());
}
public void testNonLinearGreaterThan() throws Exception {
init();
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(50);
ioContext.setComparison(1);
when(rcfReader.getPos()).thenReturn(25L);
// By setting the comparison to greater, the search should use the block [0, 50]
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(25);
}
public void testNonLinearLessThan() throws Exception {
init();
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(50);
ioContext.setComparison(-1);
when(rcfReader.getPos()).thenReturn(75L);
// By setting the comparison to less, the search should use the block [50, 100]
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(75);
}
public void testNonLinearEqualTo() throws Exception {
init();
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(50);
ioContext.setComparison(0);
when(rcfReader.getPos()).thenReturn(25L);
// By setting the comparison to equal, the search should use the block [0, 50]
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(25);
}
public void testHitLastBlock() throws Exception {
init();
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(50);
ioContext.setComparison(-1);
@@ -202,7 +202,7 @@ public void testHitLastBlock() throws Exception {
// When sync is called it will return 100, the value signaling the end of the file, this should
// result in a call to sync to the beginning of the block it was searching [50, 100], and it
// should continue normally
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
InOrder inOrder = inOrder(rcfReader);
inOrder.verify(rcfReader).sync(75);
inOrder.verify(rcfReader).sync(50);
@@ -211,14 +211,14 @@ public void testHitLastBlock() throws Exception {
public void testHitSamePositionTwice() throws Exception {
init();
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
verify(rcfReader).sync(50);
ioContext.setComparison(1);
// When getPos is called it should return the same value, signaling the end of the search, so
// the search should continue linearly and it should sync to the beginning of the block [0, 50]
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
InOrder inOrder = inOrder(rcfReader);
inOrder.verify(rcfReader).sync(25);
inOrder.verify(rcfReader).sync(0);
@@ -228,20 +228,20 @@ public void testHitSamePositionTwice() throws Exception {
public void testResetRange() throws Exception {
init();
InOrder inOrder = inOrder(rcfReader);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
inOrder.verify(rcfReader).sync(50);
ioContext.setComparison(-1);
when(rcfReader.getPos()).thenReturn(75L);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
inOrder.verify(rcfReader).sync(75);
ioContext.setEndBinarySearch(true);
// This should make the search linear, sync to the beginning of the block being searched
// [50, 100], set the comparison to be null, and the flag to reset the range should be unset
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
inOrder.verify(rcfReader).sync(50);
Assert.assertFalse(ioContext.isBinarySearching());
Assert.assertFalse(ioContext.shouldEndBinarySearch());
@@ -251,68 +251,68 @@ public void testEqualOpClass() throws Exception {
init();
ioContext.setGenericUDFClassName(GenericUDFOPEqual.class.getName());
Assert.assertTrue(ioContext.isBinarySearching());
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setBinarySearching(false);
ioContext.setComparison(-1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(0);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(1);
- Assert.assertFalse(executeDoNext(hbsReader));
+ Assert.assertFalse(executeDoNext());
}
public void testLessThanOpClass() throws Exception {
init();
ioContext.setGenericUDFClassName(GenericUDFOPLessThan.class.getName());
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
Assert.assertFalse(ioContext.isBinarySearching());
ioContext.setComparison(-1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(0);
- Assert.assertFalse(executeDoNext(hbsReader));
+ Assert.assertFalse(executeDoNext());
ioContext.setComparison(1);
- Assert.assertFalse(executeDoNext(hbsReader));
+ Assert.assertFalse(executeDoNext());
}
public void testLessThanOrEqualOpClass() throws Exception {
init();
ioContext.setGenericUDFClassName(GenericUDFOPEqualOrLessThan.class.getName());
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
Assert.assertFalse(ioContext.isBinarySearching());
ioContext.setComparison(-1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(0);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(1);
- Assert.assertFalse(executeDoNext(hbsReader));
+ Assert.assertFalse(executeDoNext());
}
public void testGreaterThanOpClass() throws Exception {
init();
ioContext.setGenericUDFClassName(GenericUDFOPGreaterThan.class.getName());
Assert.assertTrue(ioContext.isBinarySearching());
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setBinarySearching(false);
ioContext.setComparison(-1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(0);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
}
public void testGreaterThanOrEqualOpClass() throws Exception {
init();
ioContext.setGenericUDFClassName(GenericUDFOPEqualOrGreaterThan.class.getName());
Assert.assertTrue(ioContext.isBinarySearching());
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setBinarySearching(false);
ioContext.setComparison(-1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(0);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
ioContext.setComparison(1);
- Assert.assertTrue(executeDoNext(hbsReader));
+ Assert.assertTrue(executeDoNext());
}
public static void main(String[] args) throws Exception {
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/TestLineBuffer.java b/ql/src/test/org/apache/hadoop/hive/ql/io/TestLineBuffer.java
new file mode 100644
index 0000000..71ca3ac
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/io/TestLineBuffer.java
@@ -0,0 +1,66 @@
+/*
+ * 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;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * LineEndBuffer simple unit test.
+ */
+public class TestLineBuffer {
+
+ @Test
+ public void testLineEndBuffer() {
+ SkippingTextInputFormat.LineBuffer buffer;
+ buffer = new SkippingTextInputFormat.LineBuffer(3);
+ buffer.consume(200, 200);
+ buffer.consume(100, 200);
+ buffer.consume(100, 100);
+ buffer.consume(50, 100);
+ assertEquals(0, buffer.getRemainingLineCount());
+ assertEquals(50, buffer.getFirstLineStart());
+
+ buffer = new SkippingTextInputFormat.LineBuffer(3);
+ buffer.consume(200, 200);
+ buffer.consume(150, 200);
+ buffer.consume(100, 200);
+ assertEquals(0, buffer.getRemainingLineCount());
+ assertEquals(100, buffer.getFirstLineStart());
+
+ buffer = new SkippingTextInputFormat.LineBuffer(3);
+ buffer.consume(200, 200);
+ assertEquals(2, buffer.getRemainingLineCount());
+ buffer.consume(100, 100);
+ assertEquals(1, buffer.getRemainingLineCount());
+ buffer.consume(50, 100);
+ assertEquals(0, buffer.getRemainingLineCount());
+ assertEquals(50, buffer.getFirstLineStart());
+
+ buffer = new SkippingTextInputFormat.LineBuffer(3);
+ buffer.consume(200, 200);
+ assertEquals(2, buffer.getRemainingLineCount());
+ buffer.consume(50, 100);
+ assertEquals(1, buffer.getRemainingLineCount());
+ buffer.consume(25, 100);
+ assertEquals(0, buffer.getRemainingLineCount());
+ assertEquals(25, buffer.getFirstLineStart());
+ }
+}
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/TestSkippingTextInputFormat.java b/ql/src/test/org/apache/hadoop/hive/ql/io/TestSkippingTextInputFormat.java
new file mode 100644
index 0000000..9607706
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/io/TestSkippingTextInputFormat.java
@@ -0,0 +1,205 @@
+/*
+ * 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;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.ql.exec.Utilities;
+import org.apache.hadoop.hive.ql.plan.MapredWork;
+import org.apache.hadoop.hive.ql.plan.PartitionDesc;
+import org.apache.hadoop.hive.ql.plan.TableDesc;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.compress.CompressionCodec;
+import org.apache.hadoop.io.compress.CompressionCodecFactory;
+import org.apache.hadoop.mapred.FileInputFormat;
+import org.apache.hadoop.mapred.FileSplit;
+import org.apache.hadoop.mapred.InputSplit;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.hadoop.mapred.RecordReader;
+import org.apache.hadoop.mapred.Reporter;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unittest for SkippingTextInputFormat with Skip Header/Footer.
+ */
+public class TestSkippingTextInputFormat {
+
+ private Configuration conf;
+ private JobConf job;
+ private FileSystem fileSystem;
+ private Path testDir;
+ Reporter reporter;
+
+ private Path dataDir;
+
+ private CompressionCodecFactory compressionCodecs = null;
+ private CompressionCodec codec;
+
+ @Before
+ public void setUp() throws IOException {
+ conf = new Configuration();
+ job = new JobConf(conf);
+
+ TableDesc tblDesc = Utilities.defaultTd;
+ PartitionDesc partDesc = new PartitionDesc(tblDesc, null);
+ LinkedHashMap<Path, PartitionDesc> pt = new LinkedHashMap<>();
+ pt.put(new Path("/tmp/testfolder"), partDesc);
+ MapredWork mrwork = new MapredWork();
+ mrwork.getMapWork().setPathToPartitionInfo(pt);
+ Utilities.setMapRedWork(job, mrwork,new Path("/tmp/" + System.getProperty("user.name"), "hive"));
+
+ fileSystem = FileSystem.getLocal(conf);
+ testDir = new Path(System.getProperty("test.tmp.dir", System.getProperty(
+ "user.dir", new File(".").getAbsolutePath()))
+ + "/TestSkippingTextInputFormat");
+ reporter = Reporter.NULL;
+ fileSystem.delete(testDir, true);
+
+ dataDir = new Path(testDir, "datadir");
+ fileSystem.mkdirs(dataDir);
+ }
+
+ @After
+ public void tearDown() throws IOException {
+ fileSystem.delete(testDir, true);
+ }
+
+ /**
+ * Test CSV input file with header/footer skip.
+ */
+ @Test
+ public void testSkipFileSplits() throws Exception {
+ FileSystem fs = dataDir.getFileSystem(job);
+ FileInputFormat.setInputPaths(job, dataDir);
+
+ // First Dir with 1 File
+ Path dir1_file1 = new Path(dataDir, "skipfile1.csv");
+ writeTextFile(dir1_file1,
+ "dir1_header\n" +
+ "dir1_file1_line1\n" +
+ "dir1_file1_line2\n" +
+ "dir1_footer"
+ );
+
+ SkippingTextInputFormat inputFormat = new SkippingTextInputFormat();
+ // One header and one footer line to be deducted
+ inputFormat.configure(job, 1, 1);
+
+ FileInputFormat.setInputPaths(job, dir1_file1);
+ InputSplit[] splits = inputFormat.getSplits(job, 2);
+
+ assertTrue(splits.length == 2);
+
+ // Read all values.
+ List<String> received = new ArrayList<String>();
+ for (int i=0; i < splits.length; i++) {
+ RecordReader<LongWritable, Text> reader =
+ inputFormat.getRecordReader(splits[i], job, reporter);
+
+ HiveInputFormat.HiveInputSplit hiveInputSplit =
+ new HiveInputFormat.HiveInputSplit(splits[i], inputFormat.getClass().getName());
+ assertTrue(hiveInputSplit.getInputSplit().getClass() == FileSplit.class);
+
+ LongWritable key = reader.createKey();
+ Text value = reader.createValue();
+ while (reader.next(key, value)) {
+ received.add(value.toString());
+ }
+ reader.close();
+ }
+ // make sure we skipped the header and the footer across splits
+ assertTrue(received.size() == 2);
+ assertTrue(!received.get(0).contains("header"));
+ assertTrue(!received.get(received.size()-1).contains("footer"));
+ }
+
+ /**
+ * Test compressed CSV input file with header/footer skip.
+ */
+ @Test
+ public void testSkipCompressedFileSplits() throws Exception {
+ FileSystem fs = dataDir.getFileSystem(job);
+ FileInputFormat.setInputPaths(job, dataDir);
+
+ // First Dir with 1 Compressed CSV File
+ Path dir1_file1 = new Path(dataDir, "skipfile1.csv.bz2");
+ writeTextFile(dir1_file1,
+ "dir1_header\n" +
+ "dir1_file1_line1\n" +
+ "dir1_file1_line2\n" +
+ "dir1_footer"
+ );
+
+ SkippingTextInputFormat inputFormat = new SkippingTextInputFormat();
+ // One header and one footer line to be deducted
+ inputFormat.configure(job, 1, 1);
+
+ compressionCodecs = new CompressionCodecFactory(conf);
+ codec = compressionCodecs.getCodec(dir1_file1);
+ System.out.println("Codec: "+ codec);
+
+ FileInputFormat.setInputPaths(job, dir1_file1);
+ InputSplit[] splits = inputFormat.getSplits(job, 1);
+
+ // Should not generate splits for compressed file!
+ assertTrue(splits.length == 1);
+
+ // Read all values.
+ List<String> received = new ArrayList<String>();
+ for (int i=0; i < splits.length; i++) {
+ RecordReader<LongWritable, Text> reader =
+ inputFormat.getRecordReader(splits[i], job, reporter);
+
+ HiveInputFormat.HiveInputSplit hiveInputSplit =
+ new HiveInputFormat.HiveInputSplit(splits[i], inputFormat.getClass().getName());
+ System.out.println(hiveInputSplit.getInputSplit().getClass());
+ assertTrue(FileSplit.class == hiveInputSplit.getInputSplit().getClass());
+ System.out.println("Split: [" +i + "] "+ hiveInputSplit.getStart() + " => " + hiveInputSplit.getLength());
+
+ LongWritable key = reader.createKey();
+ Text value = reader.createValue();
+ while (reader.next(key, value)) {
+ System.out.println("Splits:" + i + " Val: "+ value);
+ received.add(value.toString());
+ }
+ reader.close();
+ }
+ }
+
+ /**
+ * Writes the given string to the given file.
+ */
+ private void writeTextFile(Path file, String content) throws IOException {
+ OutputStreamWriter writer = new OutputStreamWriter(fileSystem.create(file));
+ writer.write(content);
+ writer.close();
+ }
+}
diff --git a/ql/src/test/queries/clientpositive/compressed_skip_header_footer_aggr.q b/ql/src/test/queries/clientpositive/compressed_skip_header_footer_aggr.q
new file mode 100644
index 0000000..58853be
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/compressed_skip_header_footer_aggr.q
@@ -0,0 +1,100 @@
+SET hive.query.results.cache.enabled=false;
+SET hive.mapred.mode=nonstrict;
+SET hive.explain.user=false;
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/testcase1;
+dfs -copyFromLocal ../../data/files/compressed_4line_file1.csv ${system:test.tmp.dir}/testcase1/;
+--
+--
+CREATE EXTERNAL TABLE `testcase1`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+ LOCATION '${system:test.tmp.dir}/testcase1'
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1");
+
+CREATE EXTERNAL TABLE `testcase2`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+ LOCATION '${system:test.tmp.dir}/testcase1'
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0");
+
+CREATE EXTERNAL TABLE `testcase3`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+ LOCATION '${system:test.tmp.dir}/testcase1'
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1");
+
+SET hive.fetch.task.conversion = more;
+
+select * from testcase1;
+select count(*) from testcase1;
+
+select * from testcase2;
+select count(*) from testcase2;
+
+select * from testcase3;
+select count(*) from testcase3;
+
+SET hive.fetch.task.conversion = none;
+
+
+select * from testcase1;
+select count(*) from testcase1;
+
+select * from testcase2;
+select count(*) from testcase2;
+
+select * from testcase3;
+select count(*) from testcase3;
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/testcase2;
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/testcase3;
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/testcase4;
+dfs -copyFromLocal ../../data/files/compressed_4line_file2.csv.bz2 ${system:test.tmp.dir}/testcase2/;
+dfs -copyFromLocal ../../data/files/compressed_4line_file2.csv.bz2 ${system:test.tmp.dir}/testcase3/;
+dfs -copyFromLocal ../../data/files/compressed_4line_file2.csv.bz2 ${system:test.tmp.dir}/testcase4/;
+--
+-- Stored encoded in Cache so need to create separate Tables
+CREATE EXTERNAL TABLE `testcase4`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+ LOCATION '${system:test.tmp.dir}/testcase2'
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1");
+
+CREATE EXTERNAL TABLE `testcase5`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+ LOCATION '${system:test.tmp.dir}/testcase3'
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0");
+
+CREATE EXTERNAL TABLE `testcase6`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+ LOCATION '${system:test.tmp.dir}/testcase4'
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1");
+
+SET hive.fetch.task.conversion = more;
+
+select * from testcase4;
+select count(*) from testcase4;
+
+select * from testcase5;
+select count(*) from testcase5;
+
+select * from testcase6;
+select count(*) from testcase6;
+
+SET hive.fetch.task.conversion = none;
+
+select * from testcase4;
+select count(*) from testcase4;
+
+select * from testcase5;
+select count(*) from testcase5;
+
+select * from testcase6;
+select count(*) from testcase6;
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/testcase_gz;
+dfs -copyFromLocal ../../data/files/test.csv.gz ${system:test.tmp.dir}/testcase_gz/;
+
+create table testcase_gz(age int, name string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
+stored as textfile LOCATION '${system:test.tmp.dir}/testcase_gz'
+TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1");
+
+SET hive.fetch.task.conversion = more;
+select * from testcase_gz;
+select count(*) from testcase_gz;
+
+set hive.fetch.task.conversion=none;
+select * from testcase_gz;
+select count(*) from testcase_gz;
\ No newline at end of file
diff --git a/ql/src/test/queries/clientpositive/skip_header_footer_aggr.q b/ql/src/test/queries/clientpositive/skip_header_footer_aggr.q
new file mode 100644
index 0000000..b98da38
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/skip_header_footer_aggr.q
@@ -0,0 +1,98 @@
+set hive.mapred.mode=nonstrict;
+
+dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir};
+dfs -copyFromLocal ../../data/files/header_footer_table_4 ${system:test.tmp.dir}/header_footer_table_4;
+
+CREATE TABLE numbrs (numbr int);
+INSERT INTO numbrs VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (NULL);
+CREATE EXTERNAL TABLE header_footer_table_4 (header_int int, header_name string, header_choice varchar(10)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '${system:test.tmp.dir}/header_footer_table_4' tblproperties ("skip.header.line.count"="1", "skip.footer.line.count"="2");
+
+SELECT * FROM header_footer_table_4;
+
+SELECT * FROM header_footer_table_4 ORDER BY header_int LIMIT 8;
+
+-- should return nothing as title is correctly skipped
+SELECT * FROM header_footer_table_4 WHERE header_choice = 'header_choice';
+SELECT * FROM header_footer_table_4 WHERE header_choice = 'monthly';
+SELECT COUNT(*) FROM header_footer_table_4;
+
+-- shpuld return nothing
+SELECT * FROM header_footer_table_4 WHERE header_choice is NULL;
+
+
+SELECT AVG(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+
+-- should not include any header and footer
+SELECT * FROM header_footer_table_4 A, header_footer_table_4 B ORDER BY A.header_int, B.header_int;
+
+-- no join variant should include header or footer
+SELECT header_name, header_int FROM header_footer_table_4 LEFT JOIN numbrs ON numbr = header_int;
+SELECT header_name, header_int FROM header_footer_table_4 RIGHT JOIN numbrs ON numbr = header_int;
+SELECT header_name, header_int FROM header_footer_table_4 INNER JOIN numbrs ON numbr = header_int;
+SELECT header_name, header_int FROM header_footer_table_4 FULL JOIN numbrs ON numbr = header_int;
+
+
+SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+
+
+SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+
+
+SELECT header_name, header_choice FROM header_footer_table_4 ORDER BY header_int LIMIT 8;
+
+-- create table from existing text file should not feed header or footer to the new table
+CREATE TABLE transition (title VARCHAR(10), name VARCHAR(10)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '${system:test.tmp.dir}/header_footer_table_transition';
+INSERT INTO transition SELECT header_choice, header_name FROM header_footer_table_4;
+SELECT * FROM transition A, transition B ORDER BY A.title, A.name, B.title, B.name;
+
+CREATE TABLE transition2 (header_choice VARCHAR(10), sum_header_int int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '${system:test.tmp.dir}/test/header_footer_table_transition2';
+INSERT INTO transition2 SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+SELECT * FROM transition2 A, transition2 B ORDER BY A.sum_header_int, A.header_choice, B.sum_header_int, B.header_choice;
+
+DROP TABLE transition;
+DROP TABLE transition2;
+
+-- turn off fetch conversion. This disables the additional header/footer handling logic in fetch operator.
+set hive.fetch.task.conversion=none;
+
+SELECT * FROM header_footer_table_4;
+
+SELECT * FROM header_footer_table_4 ORDER BY header_int LIMIT 8;
+
+-- should return nothing as title is correctly skipped
+SELECT * FROM header_footer_table_4 WHERE header_choice = 'header_choice';
+SELECT * FROM header_footer_table_4 WHERE header_choice = 'monthly';
+SELECT COUNT(*) FROM header_footer_table_4;
+
+-- shpuld return nothing
+SELECT * FROM header_footer_table_4 WHERE header_choice is NULL;
+
+
+SELECT AVG(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+
+-- should not include any header and footer
+SELECT * FROM header_footer_table_4 A, header_footer_table_4 B ORDER BY A.header_int, B.header_int;
+
+-- no join variant should include header or footer
+SELECT header_name, header_int FROM header_footer_table_4 LEFT JOIN numbrs ON numbr = header_int;
+SELECT header_name, header_int FROM header_footer_table_4 RIGHT JOIN numbrs ON numbr = header_int;
+SELECT header_name, header_int FROM header_footer_table_4 INNER JOIN numbrs ON numbr = header_int;
+SELECT header_name, header_int FROM header_footer_table_4 FULL JOIN numbrs ON numbr = header_int;
+
+
+SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+
+
+SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+
+
+SELECT header_name, header_choice FROM header_footer_table_4 ORDER BY header_int LIMIT 8;
+
+-- create table from existing text file should not feed header or footer to the new table
+CREATE TABLE transition (title VARCHAR(10), name VARCHAR(10)) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '${system:test.tmp.dir}/header_footer_table_transition';
+INSERT INTO transition SELECT header_choice, header_name FROM header_footer_table_4;
+SELECT * FROM transition A, transition B ORDER BY A.title, A.name, B.title, B.name;
+
+CREATE TABLE transition2 (header_choice VARCHAR(10), sum_header_int int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '${system:test.tmp.dir}/test/header_footer_table_transition2';
+INSERT INTO transition2 SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice;
+SELECT * FROM transition2 A, transition2 B ORDER BY A.sum_header_int, A.header_choice, B.sum_header_int, B.header_choice;
diff --git a/ql/src/test/queries/clientpositive/skip_header_footer_proj.q b/ql/src/test/queries/clientpositive/skip_header_footer_proj.q
new file mode 100644
index 0000000..478baef
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/skip_header_footer_proj.q
@@ -0,0 +1,25 @@
+SET hive.fetch.task.conversion=none;
+-- no footer
+DROP TABLE IF EXISTS hf1;
+CREATE TABLE hf1 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='1');
+INSERT OVERWRITE TABLE hf1 VALUES ('x','y'),('a','b'),('c','d');
+SELECT * FROM hf1;
+
+-- no header
+DROP TABLE IF EXISTS hf2;
+CREATE TABLE hf2 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.footer.line.count'='2');
+INSERT OVERWRITE TABLE hf2 VALUES ('x','y'),('a','b'),('c','d');
+SELECT * FROM hf2;
+
+-- only header, no data
+DROP TABLE IF EXISTS hf3;
+CREATE TABLE hf3 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='3');
+INSERT OVERWRITE TABLE hf3 VALUES ('x','y'),('a','b'),('c','d');
+SELECT * FROM hf3;
+
+-- header and footer, no data
+DROP TABLE IF EXISTS hf4;
+CREATE TABLE hf4 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='1','skip.footer.line.count'='2');
+INSERT OVERWRITE TABLE hf4 VALUES ('x','y'),('a','b'),('c','d');
+SELECT * FROM hf4;
+
diff --git a/ql/src/test/results/clientpositive/llap/compressed_skip_header_footer_aggr.q.out b/ql/src/test/results/clientpositive/llap/compressed_skip_header_footer_aggr.q.out
new file mode 100644
index 0000000..faea853
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/compressed_skip_header_footer_aggr.q.out
@@ -0,0 +1,361 @@
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase1`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase1
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase1`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase1
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase2`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase2
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase2`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase2
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase3`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase3
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase3`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase3
+PREHOOK: query: select * from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+3 2019-12-31
+PREHOOK: query: select count(*) from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase4`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase4
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase4`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase4
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase5`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase5
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase5`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase5
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase6`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase6
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase6`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase6
+PREHOOK: query: select * from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+3 2019-12-31 02
+PREHOOK: query: select count(*) from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31 00
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+3 2019-12-31 02
+PREHOOK: query: select count(*) from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31 00
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: create table testcase_gz(age int, name string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase_gz
+POSTHOOK: query: create table testcase_gz(age int, name string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase_gz
+PREHOOK: query: select * from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 a
+2 b
+PREHOOK: query: select count(*) from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 a
+2 b
+PREHOOK: query: select count(*) from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
diff --git a/ql/src/test/results/clientpositive/llap/create_genericudaf.q.out b/ql/src/test/results/clientpositive/llap/create_genericudaf.q.out
new file mode 100644
index 0000000..d71de35
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/create_genericudaf.q.out
@@ -0,0 +1,108 @@
+PREHOOK: query: EXPLAIN
+CREATE TEMPORARY FUNCTION test_avg AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_avg
+POSTHOOK: query: EXPLAIN
+CREATE TEMPORARY FUNCTION test_avg AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_avg
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+
+PREHOOK: query: CREATE TEMPORARY FUNCTION test_avg AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_avg
+POSTHOOK: query: CREATE TEMPORARY FUNCTION test_avg AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_avg
+PREHOOK: query: EXPLAIN
+SELECT
+ test_avg(1),
+ test_avg(substr(value,5))
+FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: EXPLAIN
+SELECT
+ test_avg(1),
+ test_avg(substr(value,5))
+FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+#### A masked pattern was here ####
+ Edges:
+ Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: src
+ Statistics: Num rows: 500 Data size: 45500 Basic stats: COMPLETE Column stats: COMPLETE
+ Select Operator
+ expressions: substr(value, 5) (type: string)
+ outputColumnNames: _col1
+ Statistics: Num rows: 500 Data size: 45500 Basic stats: COMPLETE Column stats: COMPLETE
+ Group By Operator
+ aggregations: test_avg(1), test_avg(_col1)
+ mode: hash
+ outputColumnNames: _col0, _col1
+ Statistics: Num rows: 1 Data size: 332 Basic stats: COMPLETE Column stats: COMPLETE
+ Reduce Output Operator
+ sort order:
+ Statistics: Num rows: 1 Data size: 332 Basic stats: COMPLETE Column stats: COMPLETE
+ value expressions: _col0 (type: struct<count:bigint,sum:double,input:int>), _col1 (type: struct<count:bigint,sum:double,input:string>)
+ Reducer 2
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations: test_avg(VALUE._col0), test_avg(VALUE._col1)
+ mode: mergepartial
+ outputColumnNames: _col0, _col1
+ Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: COMPLETE
+ File Output Operator
+ compressed: false
+ Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: COMPLETE
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+
+PREHOOK: query: SELECT
+ test_avg(1),
+ test_avg(substr(value,5))
+FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT
+ test_avg(1),
+ test_avg(substr(value,5))
+FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1.0 260.182
+PREHOOK: query: DROP TEMPORARY FUNCTIOn test_avg
+PREHOOK: type: DROPFUNCTION
+PREHOOK: Output: test_avg
+POSTHOOK: query: DROP TEMPORARY FUNCTIOn test_avg
+POSTHOOK: type: DROPFUNCTION
+POSTHOOK: Output: test_avg
diff --git a/ql/src/test/results/clientpositive/llap/create_udaf.q.out b/ql/src/test/results/clientpositive/llap/create_udaf.q.out
new file mode 100644
index 0000000..b2dd85a
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/create_udaf.q.out
@@ -0,0 +1,97 @@
+PREHOOK: query: EXPLAIN
+CREATE TEMPORARY FUNCTION test_max AS 'org.apache.hadoop.hive.ql.udf.UDAFTestMax'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_max
+POSTHOOK: query: EXPLAIN
+CREATE TEMPORARY FUNCTION test_max AS 'org.apache.hadoop.hive.ql.udf.UDAFTestMax'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_max
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+
+PREHOOK: query: CREATE TEMPORARY FUNCTION test_max AS 'org.apache.hadoop.hive.ql.udf.UDAFTestMax'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_max
+POSTHOOK: query: CREATE TEMPORARY FUNCTION test_max AS 'org.apache.hadoop.hive.ql.udf.UDAFTestMax'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_max
+PREHOOK: query: CREATE TABLE dest1_n34(col INT)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@dest1_n34
+POSTHOOK: query: CREATE TABLE dest1_n34(col INT)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@dest1_n34
+PREHOOK: query: FROM src INSERT OVERWRITE TABLE dest1_n34 SELECT test_max(length(src.value))
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@dest1_n34
+POSTHOOK: query: FROM src INSERT OVERWRITE TABLE dest1_n34 SELECT test_max(length(src.value))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@dest1_n34
+POSTHOOK: Lineage: dest1_n34.col EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: SELECT dest1_n34.* FROM dest1_n34
+PREHOOK: type: QUERY
+PREHOOK: Input: default@dest1_n34
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT dest1_n34.* FROM dest1_n34
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@dest1_n34
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7
+PREHOOK: query: SELECT test_max(CAST(length(src.value) AS SMALLINT)) FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT test_max(CAST(length(src.value) AS SMALLINT)) FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7
+PREHOOK: query: SELECT test_max(CAST(length(src.value) AS BIGINT)) FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT test_max(CAST(length(src.value) AS BIGINT)) FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7
+PREHOOK: query: SELECT test_max(CAST(length(src.value) AS DOUBLE)) FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT test_max(CAST(length(src.value) AS DOUBLE)) FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7.0
+PREHOOK: query: SELECT test_max(CAST(length(src.value) AS FLOAT)) FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT test_max(CAST(length(src.value) AS FLOAT)) FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7.0
+PREHOOK: query: SELECT test_max(substr(src.value,5)) FROM src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT test_max(substr(src.value,5)) FROM src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+98
+PREHOOK: query: DROP TEMPORARY FUNCTION test_max
+PREHOOK: type: DROPFUNCTION
+PREHOOK: Output: test_max
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_max
+POSTHOOK: type: DROPFUNCTION
+POSTHOOK: Output: test_max
diff --git a/ql/src/test/results/clientpositive/llap/create_view.q.out b/ql/src/test/results/clientpositive/llap/create_view.q.out
new file mode 100644
index 0000000..d77e0f2
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/create_view.q.out
@@ -0,0 +1,1766 @@
+PREHOOK: query: DROP VIEW view1
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view1
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view2
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view2
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view3
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view3
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view4
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view4
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view5
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view5
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view6
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view6
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view7
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view7
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view8
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view8
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view9
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view9
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view10
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view10
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view11
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view11
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view12
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view12
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view13
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view13
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view14
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view14
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view15
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view15
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP VIEW view16
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW view16
+POSTHOOK: type: DROPVIEW
+PREHOOK: query: DROP TEMPORARY FUNCTION test_translate
+PREHOOK: type: DROPFUNCTION
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_translate
+POSTHOOK: type: DROPFUNCTION
+PREHOOK: query: DROP TEMPORARY FUNCTION test_max
+PREHOOK: type: DROPFUNCTION
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_max
+POSTHOOK: type: DROPFUNCTION
+PREHOOK: query: DROP TEMPORARY FUNCTION test_explode
+PREHOOK: type: DROPFUNCTION
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_explode
+POSTHOOK: type: DROPFUNCTION
+PREHOOK: query: SELECT * FROM src WHERE key=86
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM src WHERE key=86
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86 val_86
+PREHOOK: query: CREATE VIEW view1 AS SELECT value FROM src WHERE key=86
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view1
+POSTHOOK: query: CREATE VIEW view1 AS SELECT value FROM src WHERE key=86
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view1
+POSTHOOK: Lineage: view1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: CREATE VIEW view2 AS SELECT * FROM src
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view2
+POSTHOOK: query: CREATE VIEW view2 AS SELECT * FROM src
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view2
+POSTHOOK: Lineage: view2.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view2.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: CREATE VIEW view3(valoo)
+TBLPROPERTIES ("fear" = "factor")
+AS SELECT upper(value) FROM src WHERE key=86
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view3
+POSTHOOK: query: CREATE VIEW view3(valoo)
+TBLPROPERTIES ("fear" = "factor")
+AS SELECT upper(value) FROM src WHERE key=86
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view3
+POSTHOOK: Lineage: view3.valoo EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: SELECT * from view1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * from view1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+val_86
+PREHOOK: query: SELECT * from view2 where key=18
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * from view2 where key=18
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+18 val_18
+18 val_18
+PREHOOK: query: SELECT * from view3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * from view3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+VAL_86
+PREHOOK: query: EXPLAIN
+CREATE VIEW view0(valoo) AS SELECT upper(value) FROM src WHERE key=86
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view0
+POSTHOOK: query: EXPLAIN
+CREATE VIEW view0(valoo) AS SELECT upper(value) FROM src WHERE key=86
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view0
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-1
+ Create View Operator:
+ Create View
+ columns: valoo string
+ expanded text: SELECT `_c0` AS `valoo` FROM (SELECT upper(`src`.`value`) FROM `default`.`src` WHERE `src`.`key`=86) `view0`
+ name: default.view0
+ original text: SELECT upper(value) FROM src WHERE key=86
+
+PREHOOK: query: EXPLAIN
+SELECT * from view2 where key=18
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: EXPLAIN
+SELECT * from view2 where key=18
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ TableScan
+ alias: src
+ properties:
+ insideView TRUE
+ Filter Operator
+ predicate: (UDFToDouble(key) = 18.0D) (type: boolean)
+ Select Operator
+ expressions: key (type: string), value (type: string)
+ outputColumnNames: _col0, _col1
+ ListSink
+
+PREHOOK: query: SHOW TABLES 'view.*'
+PREHOOK: type: SHOWTABLES
+PREHOOK: Input: database:default
+POSTHOOK: query: SHOW TABLES 'view.*'
+POSTHOOK: type: SHOWTABLES
+POSTHOOK: Input: database:default
+view1
+view2
+view3
+PREHOOK: query: SHOW VIEWS 'view.*'
+PREHOOK: type: SHOWVIEWS
+POSTHOOK: query: SHOW VIEWS 'view.*'
+POSTHOOK: type: SHOWVIEWS
+view1
+view2
+view3
+PREHOOK: query: DESCRIBE view1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view1
+POSTHOOK: query: DESCRIBE view1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view1
+value string
+PREHOOK: query: DESCRIBE EXTENDED view1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view1
+POSTHOOK: query: DESCRIBE EXTENDED view1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view1
+value string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view1
+POSTHOOK: query: DESCRIBE FORMATTED view1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view1
+# col_name data_type comment
+value string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT value FROM src WHERE key=86
+Expanded Query: SELECT `src`.`value` FROM `default`.`src` WHERE `src`.`key`=86
+PREHOOK: query: DESCRIBE view2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view2
+POSTHOOK: query: DESCRIBE view2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view2
+key string
+value string
+PREHOOK: query: DESCRIBE EXTENDED view2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view2
+POSTHOOK: query: DESCRIBE EXTENDED view2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view2
+key string
+value string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view2
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view2
+POSTHOOK: query: DESCRIBE FORMATTED view2
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view2
+# col_name data_type comment
+key string
+value string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT * FROM src
+Expanded Query: SELECT `src`.`key`, `src`.`value` FROM `default`.`src`
+PREHOOK: query: DESCRIBE view3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view3
+POSTHOOK: query: DESCRIBE view3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view3
+valoo string
+PREHOOK: query: DESCRIBE EXTENDED view3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view3
+POSTHOOK: query: DESCRIBE EXTENDED view3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view3
+valoo string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view3
+POSTHOOK: query: DESCRIBE FORMATTED view3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view3
+# col_name data_type comment
+valoo string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+ fear factor
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT upper(value) FROM src WHERE key=86
+Expanded Query: SELECT `_c0` AS `valoo` FROM (SELECT upper(`src`.`value`) FROM `default`.`src` WHERE `src`.`key`=86) `view3`
+PREHOOK: query: ALTER VIEW view3 SET TBLPROPERTIES ("biggest" = "loser")
+PREHOOK: type: ALTERVIEW_PROPERTIES
+PREHOOK: Input: default@view3
+PREHOOK: Output: default@view3
+POSTHOOK: query: ALTER VIEW view3 SET TBLPROPERTIES ("biggest" = "loser")
+POSTHOOK: type: ALTERVIEW_PROPERTIES
+POSTHOOK: Input: default@view3
+POSTHOOK: Output: default@view3
+PREHOOK: query: DESCRIBE EXTENDED view3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view3
+POSTHOOK: query: DESCRIBE EXTENDED view3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view3
+valoo string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view3
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view3
+POSTHOOK: query: DESCRIBE FORMATTED view3
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view3
+# col_name data_type comment
+valoo string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ biggest loser
+ bucketing_version 2
+ fear factor
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT upper(value) FROM src WHERE key=86
+Expanded Query: SELECT `_c0` AS `valoo` FROM (SELECT upper(`src`.`value`) FROM `default`.`src` WHERE `src`.`key`=86) `view3`
+PREHOOK: query: CREATE TABLE table1_n4 (key int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@table1_n4
+POSTHOOK: query: CREATE TABLE table1_n4 (key int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@table1_n4
+PREHOOK: query: DESCRIBE EXTENDED table1_n4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@table1_n4
+POSTHOOK: query: DESCRIBE EXTENDED table1_n4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@table1_n4
+key int
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE EXTENDED src1
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@src1
+POSTHOOK: query: DESCRIBE EXTENDED src1
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@src1
+key string default
+value string default
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE EXTENDED table1_n4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@table1_n4
+POSTHOOK: query: DESCRIBE EXTENDED table1_n4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@table1_n4
+key int
+
+#### A masked pattern was here ####
+PREHOOK: query: INSERT OVERWRITE TABLE table1_n4 SELECT key FROM src WHERE key = 86
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@table1_n4
+POSTHOOK: query: INSERT OVERWRITE TABLE table1_n4 SELECT key FROM src WHERE key = 86
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@table1_n4
+POSTHOOK: Lineage: table1_n4.key EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+PREHOOK: query: SELECT * FROM table1_n4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM table1_n4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86
+PREHOOK: query: CREATE VIEW view4 AS SELECT * FROM table1_n4
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view4
+POSTHOOK: query: CREATE VIEW view4 AS SELECT * FROM table1_n4
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view4
+POSTHOOK: Lineage: view4.key SIMPLE [(table1_n4)table1_n4.FieldSchema(name:key, type:int, comment:null), ]
+PREHOOK: query: SELECT * FROM view4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Input: default@view4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Input: default@view4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86
+PREHOOK: query: DESCRIBE view4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view4
+POSTHOOK: query: DESCRIBE view4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view4
+key int
+PREHOOK: query: ALTER TABLE table1_n4 ADD COLUMNS (value STRING)
+PREHOOK: type: ALTERTABLE_ADDCOLS
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: default@table1_n4
+POSTHOOK: query: ALTER TABLE table1_n4 ADD COLUMNS (value STRING)
+POSTHOOK: type: ALTERTABLE_ADDCOLS
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: default@table1_n4
+PREHOOK: query: SELECT * FROM table1_n4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM table1_n4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86 NULL
+PREHOOK: query: SELECT * FROM view4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Input: default@view4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Input: default@view4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86
+PREHOOK: query: DESCRIBE table1_n4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@table1_n4
+POSTHOOK: query: DESCRIBE table1_n4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@table1_n4
+key int
+value string
+PREHOOK: query: DESCRIBE view4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view4
+POSTHOOK: query: DESCRIBE view4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view4
+key int
+PREHOOK: query: CREATE VIEW view5 AS SELECT v1.key as key1, v2.key as key2
+FROM view4 v1 join view4 v2
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@table1_n4
+PREHOOK: Input: default@view4
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view5
+POSTHOOK: query: CREATE VIEW view5 AS SELECT v1.key as key1, v2.key as key2
+FROM view4 v1 join view4 v2
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Input: default@view4
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view5
+POSTHOOK: Lineage: view5.key1 SIMPLE [(table1_n4)table1_n4.FieldSchema(name:key, type:int, comment:null), ]
+POSTHOOK: Lineage: view5.key2 SIMPLE [(table1_n4)table1_n4.FieldSchema(name:key, type:int, comment:null), ]
+Warning: Shuffle Join MERGEJOIN[9][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM view5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Input: default@view4
+PREHOOK: Input: default@view5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Input: default@view4
+POSTHOOK: Input: default@view5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86 86
+PREHOOK: query: DESCRIBE view5
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view5
+POSTHOOK: query: DESCRIBE view5
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view5
+key1 int
+key2 int
+PREHOOK: query: CREATE VIEW view6(valoo COMMENT 'I cannot spell') AS
+SELECT upper(value) as blarg FROM src WHERE key=86
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view6
+POSTHOOK: query: CREATE VIEW view6(valoo COMMENT 'I cannot spell') AS
+SELECT upper(value) as blarg FROM src WHERE key=86
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view6
+POSTHOOK: Lineage: view6.valoo EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE view6
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view6
+POSTHOOK: query: DESCRIBE view6
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view6
+valoo string I cannot spell
+PREHOOK: query: CREATE VIEW view7 AS
+SELECT * FROM src
+WHERE key > 80 AND key < 100
+ORDER BY key, value
+LIMIT 10
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view7
+POSTHOOK: query: CREATE VIEW view7 AS
+SELECT * FROM src
+WHERE key > 80 AND key < 100
+ORDER BY key, value
+LIMIT 10
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view7
+POSTHOOK: Lineage: view7.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view7.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: SELECT * FROM view7
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view7
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view7
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view7
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+82 val_82
+83 val_83
+83 val_83
+84 val_84
+84 val_84
+85 val_85
+86 val_86
+87 val_87
+90 val_90
+90 val_90
+PREHOOK: query: SELECT * FROM view7 ORDER BY key DESC, value
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view7
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view7 ORDER BY key DESC, value
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view7
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+90 val_90
+90 val_90
+87 val_87
+86 val_86
+85 val_85
+84 val_84
+84 val_84
+83 val_83
+83 val_83
+82 val_82
+PREHOOK: query: SELECT * FROM view7 LIMIT 5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view7
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view7 LIMIT 5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view7
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+82 val_82
+83 val_83
+83 val_83
+84 val_84
+84 val_84
+PREHOOK: query: SELECT * FROM view7 LIMIT 20
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view7
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view7 LIMIT 20
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view7
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+82 val_82
+83 val_83
+83 val_83
+84 val_84
+84 val_84
+85 val_85
+86 val_86
+87 val_87
+90 val_90
+90 val_90
+PREHOOK: query: CREATE TEMPORARY FUNCTION test_translate AS
+'org.apache.hadoop.hive.ql.udf.generic.GenericUDFTestTranslate'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_translate
+POSTHOOK: query: CREATE TEMPORARY FUNCTION test_translate AS
+'org.apache.hadoop.hive.ql.udf.generic.GenericUDFTestTranslate'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_translate
+PREHOOK: query: CREATE VIEW view8(c) AS
+SELECT test_translate('abc', 'a', 'b')
+FROM table1_n4
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view8
+POSTHOOK: query: CREATE VIEW view8(c) AS
+SELECT test_translate('abc', 'a', 'b')
+FROM table1_n4
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view8
+POSTHOOK: Lineage: view8.c SIMPLE []
+PREHOOK: query: DESCRIBE EXTENDED view8
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view8
+POSTHOOK: query: DESCRIBE EXTENDED view8
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view8
+c string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view8
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view8
+POSTHOOK: query: DESCRIBE FORMATTED view8
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view8
+# col_name data_type comment
+c string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT test_translate('abc', 'a', 'b')
+ FROM table1_n4
+Expanded Query: SELECT `_c0` AS `c` FROM (SELECT `test_translate`('abc', 'a', 'b')
+ FROM `default`.`table1_n4`) `view8`
+PREHOOK: query: SELECT * FROM view8
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Input: default@view8
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view8
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Input: default@view8
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+bbc
+PREHOOK: query: CREATE TEMPORARY FUNCTION test_max AS
+'org.apache.hadoop.hive.ql.udf.UDAFTestMax'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_max
+POSTHOOK: query: CREATE TEMPORARY FUNCTION test_max AS
+'org.apache.hadoop.hive.ql.udf.UDAFTestMax'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_max
+PREHOOK: query: CREATE VIEW view9(m) AS
+SELECT test_max(length(value))
+FROM src
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view9
+POSTHOOK: query: CREATE VIEW view9(m) AS
+SELECT test_max(length(value))
+FROM src
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view9
+POSTHOOK: Lineage: view9.m EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view9
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view9
+POSTHOOK: query: DESCRIBE EXTENDED view9
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view9
+m int
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view9
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view9
+POSTHOOK: query: DESCRIBE FORMATTED view9
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view9
+# col_name data_type comment
+m int
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT test_max(length(value))
+ FROM src
+Expanded Query: SELECT `_c0` AS `m` FROM (SELECT `test_max`(length(`src`.`value`))
+ FROM `default`.`src`) `view9`
+PREHOOK: query: SELECT * FROM view9
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view9
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view9
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view9
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7
+PREHOOK: query: DROP VIEW view9
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view9
+PREHOOK: Output: default@view9
+POSTHOOK: query: DROP VIEW view9
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view9
+POSTHOOK: Output: default@view9
+PREHOOK: query: CREATE VIEW view9(m) AS
+SELECT test_max(length(value))
+FROM src
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view9
+POSTHOOK: query: CREATE VIEW view9(m) AS
+SELECT test_max(length(value))
+FROM src
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view9
+POSTHOOK: Lineage: view9.m EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view9
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view9
+POSTHOOK: query: DESCRIBE EXTENDED view9
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view9
+m int
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view9
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view9
+POSTHOOK: query: DESCRIBE FORMATTED view9
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view9
+# col_name data_type comment
+m int
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT test_max(length(value))
+ FROM src
+Expanded Query: SELECT `_c0` AS `m` FROM (SELECT `test_max`(length(`src`.`value`))
+ FROM `default`.`src`) `view9`
+PREHOOK: query: SELECT * FROM view9
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view9
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view9
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view9
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+7
+PREHOOK: query: CREATE VIEW view10 AS
+SELECT slurp.* FROM (SELECT * FROM src WHERE key=86) slurp
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view10
+POSTHOOK: query: CREATE VIEW view10 AS
+SELECT slurp.* FROM (SELECT * FROM src WHERE key=86) slurp
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view10
+POSTHOOK: Lineage: view10.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view10.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view10
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view10
+POSTHOOK: query: DESCRIBE EXTENDED view10
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view10
+key string
+value string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view10
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view10
+POSTHOOK: query: DESCRIBE FORMATTED view10
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view10
+# col_name data_type comment
+key string
+value string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT slurp.* FROM (SELECT * FROM src WHERE key=86) slurp
+Expanded Query: SELECT `slurp`.`key`, `slurp`.`value` FROM (SELECT `src`.`key`, `src`.`value` FROM `default`.`src` WHERE `src`.`key`=86) `slurp`
+PREHOOK: query: SELECT * FROM view10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view10
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view10
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+86 val_86
+PREHOOK: query: CREATE TEMPORARY FUNCTION test_explode AS
+'org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode'
+PREHOOK: type: CREATEFUNCTION
+PREHOOK: Output: test_explode
+POSTHOOK: query: CREATE TEMPORARY FUNCTION test_explode AS
+'org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode'
+POSTHOOK: type: CREATEFUNCTION
+POSTHOOK: Output: test_explode
+PREHOOK: query: CREATE VIEW view11 AS
+SELECT test_explode(array(1,2,3)) AS (boom)
+FROM table1_n4
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view11
+POSTHOOK: query: CREATE VIEW view11 AS
+SELECT test_explode(array(1,2,3)) AS (boom)
+FROM table1_n4
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view11
+POSTHOOK: Lineage: view11.boom SCRIPT []
+PREHOOK: query: DESCRIBE EXTENDED view11
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view11
+POSTHOOK: query: DESCRIBE EXTENDED view11
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view11
+boom int
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view11
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view11
+POSTHOOK: query: DESCRIBE FORMATTED view11
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view11
+# col_name data_type comment
+boom int
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT test_explode(array(1,2,3)) AS (boom)
+ FROM table1_n4
+Expanded Query: SELECT `test_explode`(array(1,2,3)) AS (`boom`)
+ FROM `default`.`table1_n4`
+PREHOOK: query: SELECT * FROM view11
+PREHOOK: type: QUERY
+PREHOOK: Input: default@table1_n4
+PREHOOK: Input: default@view11
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view11
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Input: default@view11
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+2
+3
+PREHOOK: query: CREATE VIEW view12 AS
+SELECT * FROM src LATERAL VIEW explode(array(1,2,3)) myTable AS myCol
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view12
+POSTHOOK: query: CREATE VIEW view12 AS
+SELECT * FROM src LATERAL VIEW explode(array(1,2,3)) myTable AS myCol
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view12
+POSTHOOK: Lineage: view12.key EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view12.mycol SCRIPT []
+POSTHOOK: Lineage: view12.value EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view12
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view12
+POSTHOOK: query: DESCRIBE EXTENDED view12
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view12
+key string
+value string
+mycol int
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view12
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view12
+POSTHOOK: query: DESCRIBE FORMATTED view12
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view12
+# col_name data_type comment
+key string
+value string
+mycol int
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT * FROM src LATERAL VIEW explode(array(1,2,3)) myTable AS myCol
+Expanded Query: SELECT `src`.`key`, `src`.`value`, `mytable`.`mycol` FROM `default`.`src` LATERAL VIEW explode(array(1,2,3)) `myTable` AS `myCol`
+PREHOOK: query: SELECT * FROM view12
+ORDER BY key ASC, myCol ASC LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view12
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view12
+ORDER BY key ASC, myCol ASC LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view12
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+0 val_0 1
+PREHOOK: query: SELECT * FROM view2 LATERAL VIEW explode(array(1,2,3)) myTable AS myCol
+ORDER BY key ASC, myCol ASC LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view2 LATERAL VIEW explode(array(1,2,3)) myTable AS myCol
+ORDER BY key ASC, myCol ASC LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+0 val_0 1
+PREHOOK: query: CREATE VIEW view13 AS
+SELECT s.key
+FROM srcbucket TABLESAMPLE (BUCKET 1 OUT OF 5 ON key) s
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@srcbucket
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view13
+POSTHOOK: query: CREATE VIEW view13 AS
+SELECT s.key
+FROM srcbucket TABLESAMPLE (BUCKET 1 OUT OF 5 ON key) s
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@srcbucket
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view13
+POSTHOOK: Lineage: view13.key SIMPLE [(srcbucket)s.FieldSchema(name:key, type:int, comment:null), ]
+PREHOOK: query: DESCRIBE EXTENDED view13
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view13
+POSTHOOK: query: DESCRIBE EXTENDED view13
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view13
+key int
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view13
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view13
+POSTHOOK: query: DESCRIBE FORMATTED view13
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view13
+# col_name data_type comment
+key int
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT s.key
+ FROM srcbucket TABLESAMPLE (BUCKET 1 OUT OF 5 ON key) s
+Expanded Query: SELECT `s`.`key`
+ FROM `default`.`srcbucket` TABLESAMPLE (BUCKET 1 OUT OF 5 ON `key`) `s`
+PREHOOK: query: SELECT * FROM view13
+ORDER BY key LIMIT 12
+PREHOOK: type: QUERY
+PREHOOK: Input: default@srcbucket
+PREHOOK: Input: default@view13
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view13
+ORDER BY key LIMIT 12
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@srcbucket
+POSTHOOK: Input: default@view13
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+8
+8
+16
+16
+18
+18
+21
+21
+21
+21
+24
+PREHOOK: query: CREATE VIEW view14 AS
+SELECT unionsrc1.key as k1, unionsrc1.value as v1,
+ unionsrc2.key as k2, unionsrc2.value as v2
+FROM (select 'tst1' as key, cast(count(1) as string) as value from src s1
+ UNION ALL
+ select s2.key as key, s2.value as value from src s2 where s2.key < 10) unionsrc1
+JOIN
+ (select 'tst1' as key, cast(count(1) as string) as value from src s3
+ UNION ALL
+ select s4.key as key, s4.value as value from src s4 where s4.key < 10) unionsrc2
+ON (unionsrc1.key = unionsrc2.key)
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view14
+POSTHOOK: query: CREATE VIEW view14 AS
+SELECT unionsrc1.key as k1, unionsrc1.value as v1,
+ unionsrc2.key as k2, unionsrc2.value as v2
+FROM (select 'tst1' as key, cast(count(1) as string) as value from src s1
+ UNION ALL
+ select s2.key as key, s2.value as value from src s2 where s2.key < 10) unionsrc1
+JOIN
+ (select 'tst1' as key, cast(count(1) as string) as value from src s3
+ UNION ALL
+ select s4.key as key, s4.value as value from src s4 where s4.key < 10) unionsrc2
+ON (unionsrc1.key = unionsrc2.key)
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view14
+POSTHOOK: Lineage: view14.k1 EXPRESSION [(src)s2.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view14.k2 EXPRESSION [(src)s4.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view14.v1 EXPRESSION [(src)s1.null, (src)s2.FieldSchema(name:value, type:string, comment:default), ]
+POSTHOOK: Lineage: view14.v2 EXPRESSION [(src)s3.null, (src)s4.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view14
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view14
+POSTHOOK: query: DESCRIBE EXTENDED view14
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view14
+k1 string
+v1 string
+k2 string
+v2 string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view14
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view14
+POSTHOOK: query: DESCRIBE FORMATTED view14
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view14
+# col_name data_type comment
+k1 string
+v1 string
+k2 string
+v2 string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT unionsrc1.key as k1, unionsrc1.value as v1,
+ unionsrc2.key as k2, unionsrc2.value as v2
+ FROM (select 'tst1' as key, cast(count(1) as string) as value from src s1
+ UNION ALL
+ select s2.key as key, s2.value as value from src s2 where s2.key < 10) unionsrc1
+ JOIN
+ (select 'tst1' as key, cast(count(1) as string) as value from src s3
+ UNION ALL
+ select s4.key as key, s4.value as value from src s4 where s4.key < 10) unionsrc2
+ ON (unionsrc1.key = unionsrc2.key)
+Expanded Query: SELECT `unionsrc1`.`key` as `k1`, `unionsrc1`.`value` as `v1`,
+ `unionsrc2`.`key` as `k2`, `unionsrc2`.`value` as `v2`
+ FROM (select 'tst1' as `key`, cast(count(1) as string) as `value` from `default`.`src` `s1`
+ UNION ALL
+ select `s2`.`key` as `key`, `s2`.`value` as `value` from `default`.`src` `s2` where `s2`.`key` < 10) `unionsrc1`
+ JOIN
+ (select 'tst1' as `key`, cast(count(1) as string) as `value` from `default`.`src` `s3`
+ UNION ALL
+ select `s4`.`key` as `key`, `s4`.`value` as `value` from `default`.`src` `s4` where `s4`.`key` < 10) `unionsrc2`
+ ON (`unionsrc1`.`key` = `unionsrc2`.`key`)
+PREHOOK: query: SELECT * FROM view14
+ORDER BY k1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view14
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view14
+ORDER BY k1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view14
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+0 val_0 0 val_0
+2 val_2 2 val_2
+4 val_4 4 val_4
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+5 val_5 5 val_5
+8 val_8 8 val_8
+9 val_9 9 val_9
+tst1 500 tst1 500
+PREHOOK: query: CREATE VIEW view15 AS
+SELECT key,COUNT(value) AS value_count
+FROM src
+GROUP BY key
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view15
+POSTHOOK: query: CREATE VIEW view15 AS
+SELECT key,COUNT(value) AS value_count
+FROM src
+GROUP BY key
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view15
+POSTHOOK: Lineage: view15.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: view15.value_count EXPRESSION [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view15
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view15
+POSTHOOK: query: DESCRIBE EXTENDED view15
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view15
+key string
+value_count bigint
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view15
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view15
+POSTHOOK: query: DESCRIBE FORMATTED view15
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view15
+# col_name data_type comment
+key string
+value_count bigint
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT key,COUNT(value) AS value_count
+ FROM src
+ GROUP BY key
+Expanded Query: SELECT `src`.`key`,COUNT(`src`.`value`) AS `value_count`
+ FROM `default`.`src`
+ GROUP BY `src`.`key`
+PREHOOK: query: SELECT * FROM view15
+ORDER BY value_count DESC, key
+LIMIT 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view15
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view15
+ORDER BY value_count DESC, key
+LIMIT 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view15
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+230 5
+348 5
+401 5
+469 5
+138 4
+169 4
+277 4
+406 4
+468 4
+489 4
+PREHOOK: query: CREATE VIEW view16 AS
+SELECT DISTINCT value
+FROM src
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: default@src
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view16
+POSTHOOK: query: CREATE VIEW view16 AS
+SELECT DISTINCT value
+FROM src
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@src
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view16
+POSTHOOK: Lineage: view16.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: DESCRIBE EXTENDED view16
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view16
+POSTHOOK: query: DESCRIBE EXTENDED view16
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view16
+value string
+
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE FORMATTED view16
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view16
+POSTHOOK: query: DESCRIBE FORMATTED view16
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view16
+# col_name data_type comment
+value string
+
+# Detailed Table Information
+Database: default
+#### A masked pattern was here ####
+Retention: 0
+Table Type: VIRTUAL_VIEW
+Table Parameters:
+ bucketing_version 2
+#### A masked pattern was here ####
+
+# Storage Information
+SerDe Library: null
+InputFormat: org.apache.hadoop.mapred.TextInputFormat
+OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+Compressed: No
+Num Buckets: -1
+Bucket Columns: []
+Sort Columns: []
+
+# View Information
+Original Query: SELECT DISTINCT value
+ FROM src
+Expanded Query: SELECT DISTINCT `src`.`value`
+ FROM `default`.`src`
+PREHOOK: query: SELECT * FROM view16
+ORDER BY value
+LIMIT 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Input: default@view16
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM view16
+ORDER BY value
+LIMIT 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Input: default@view16
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+val_0
+val_10
+val_100
+val_103
+val_104
+val_105
+val_11
+val_111
+val_113
+val_114
+PREHOOK: query: DROP TABLE IF EXISTS view16
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@view16
+PREHOOK: Output: default@view16
+POSTHOOK: query: DROP TABLE IF EXISTS view16
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@view16
+POSTHOOK: Output: default@view16
+PREHOOK: query: DESCRIBE view16
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@view16
+POSTHOOK: query: DESCRIBE view16
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@view16
+value string
+PREHOOK: query: DROP VIEW IF EXISTS table1_n4
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@table1_n4
+PREHOOK: Output: default@table1_n4
+POSTHOOK: query: DROP VIEW IF EXISTS table1_n4
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@table1_n4
+POSTHOOK: Output: default@table1_n4
+PREHOOK: query: DESCRIBE table1_n4
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@table1_n4
+POSTHOOK: query: DESCRIBE table1_n4
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@table1_n4
+key int
+value string
+PREHOOK: query: create view view17 as select 1 as v
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view17
+POSTHOOK: query: create view view17 as select 1 as v
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view17
+POSTHOOK: Lineage: view17.v SIMPLE []
+PREHOOK: query: select * from view17
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Input: default@view17
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from view17
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Input: default@view17
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: create view view18 as select v+1 from (select 1 as v) t
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: database:default
+PREHOOK: Output: default@view18
+POSTHOOK: query: create view view18 as select v+1 from (select 1 as v) t
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@view18
+POSTHOOK: Lineage: view18._c0 SIMPLE []
+PREHOOK: query: select * from view18
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Input: default@view18
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from view18
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Input: default@view18
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: DROP VIEW view1
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view1
+PREHOOK: Output: default@view1
+POSTHOOK: query: DROP VIEW view1
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view1
+POSTHOOK: Output: default@view1
+PREHOOK: query: DROP VIEW view2
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view2
+PREHOOK: Output: default@view2
+POSTHOOK: query: DROP VIEW view2
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view2
+POSTHOOK: Output: default@view2
+PREHOOK: query: DROP VIEW view3
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view3
+PREHOOK: Output: default@view3
+POSTHOOK: query: DROP VIEW view3
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view3
+POSTHOOK: Output: default@view3
+PREHOOK: query: DROP VIEW view4
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view4
+PREHOOK: Output: default@view4
+POSTHOOK: query: DROP VIEW view4
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view4
+POSTHOOK: Output: default@view4
+PREHOOK: query: DROP VIEW view5
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view5
+PREHOOK: Output: default@view5
+POSTHOOK: query: DROP VIEW view5
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view5
+POSTHOOK: Output: default@view5
+PREHOOK: query: DROP VIEW view6
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view6
+PREHOOK: Output: default@view6
+POSTHOOK: query: DROP VIEW view6
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view6
+POSTHOOK: Output: default@view6
+PREHOOK: query: DROP VIEW view7
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view7
+PREHOOK: Output: default@view7
+POSTHOOK: query: DROP VIEW view7
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view7
+POSTHOOK: Output: default@view7
+PREHOOK: query: DROP VIEW view8
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view8
+PREHOOK: Output: default@view8
+POSTHOOK: query: DROP VIEW view8
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view8
+POSTHOOK: Output: default@view8
+PREHOOK: query: DROP VIEW view9
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view9
+PREHOOK: Output: default@view9
+POSTHOOK: query: DROP VIEW view9
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view9
+POSTHOOK: Output: default@view9
+PREHOOK: query: DROP VIEW view10
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view10
+PREHOOK: Output: default@view10
+POSTHOOK: query: DROP VIEW view10
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view10
+POSTHOOK: Output: default@view10
+PREHOOK: query: DROP VIEW view11
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view11
+PREHOOK: Output: default@view11
+POSTHOOK: query: DROP VIEW view11
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view11
+POSTHOOK: Output: default@view11
+PREHOOK: query: DROP VIEW view12
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view12
+PREHOOK: Output: default@view12
+POSTHOOK: query: DROP VIEW view12
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view12
+POSTHOOK: Output: default@view12
+PREHOOK: query: DROP VIEW view13
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view13
+PREHOOK: Output: default@view13
+POSTHOOK: query: DROP VIEW view13
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view13
+POSTHOOK: Output: default@view13
+PREHOOK: query: DROP VIEW view14
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view14
+PREHOOK: Output: default@view14
+POSTHOOK: query: DROP VIEW view14
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view14
+POSTHOOK: Output: default@view14
+PREHOOK: query: DROP VIEW view15
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view15
+PREHOOK: Output: default@view15
+POSTHOOK: query: DROP VIEW view15
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view15
+POSTHOOK: Output: default@view15
+PREHOOK: query: DROP VIEW view16
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view16
+PREHOOK: Output: default@view16
+POSTHOOK: query: DROP VIEW view16
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view16
+POSTHOOK: Output: default@view16
+PREHOOK: query: DROP VIEW view17
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view17
+PREHOOK: Output: default@view17
+POSTHOOK: query: DROP VIEW view17
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view17
+POSTHOOK: Output: default@view17
+PREHOOK: query: DROP VIEW view18
+PREHOOK: type: DROPVIEW
+PREHOOK: Input: default@view18
+PREHOOK: Output: default@view18
+POSTHOOK: query: DROP VIEW view18
+POSTHOOK: type: DROPVIEW
+POSTHOOK: Input: default@view18
+POSTHOOK: Output: default@view18
+PREHOOK: query: DROP TEMPORARY FUNCTION test_translate
+PREHOOK: type: DROPFUNCTION
+PREHOOK: Output: test_translate
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_translate
+POSTHOOK: type: DROPFUNCTION
+POSTHOOK: Output: test_translate
+PREHOOK: query: DROP TEMPORARY FUNCTION test_max
+PREHOOK: type: DROPFUNCTION
+PREHOOK: Output: test_max
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_max
+POSTHOOK: type: DROPFUNCTION
+POSTHOOK: Output: test_max
+PREHOOK: query: DROP TEMPORARY FUNCTION test_explode
+PREHOOK: type: DROPFUNCTION
+PREHOOK: Output: test_explode
+POSTHOOK: query: DROP TEMPORARY FUNCTION test_explode
+POSTHOOK: type: DROPFUNCTION
+POSTHOOK: Output: test_explode
diff --git a/ql/src/test/results/clientpositive/llap/skip_header_footer_aggr.q.out b/ql/src/test/results/clientpositive/llap/skip_header_footer_aggr.q.out
new file mode 100644
index 0000000..530e81f
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/skip_header_footer_aggr.q.out
@@ -0,0 +1,849 @@
+PREHOOK: query: CREATE TABLE numbrs (numbr int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@numbrs
+POSTHOOK: query: CREATE TABLE numbrs (numbr int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@numbrs
+PREHOOK: query: INSERT INTO numbrs VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (NULL)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@numbrs
+POSTHOOK: query: INSERT INTO numbrs VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (NULL)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@numbrs
+POSTHOOK: Lineage: numbrs.numbr SCRIPT []
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@header_footer_table_4
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@header_footer_table_4
+PREHOOK: query: SELECT * FROM header_footer_table_4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+12 alex daily
+3 barry yearly
+5 chelsea monthly
+8 xavier monthly
+9 derek yearly
+11 ethan monthly
+1 faith yearly
+21 yves daily
+PREHOOK: query: SELECT * FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 faith yearly
+3 barry yearly
+5 chelsea monthly
+8 xavier monthly
+9 derek yearly
+11 ethan monthly
+12 alex daily
+21 yves daily
+PREHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'header_choice'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'header_choice'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+PREHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'monthly'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'monthly'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+5 chelsea monthly
+8 xavier monthly
+11 ethan monthly
+PREHOOK: query: SELECT COUNT(*) FROM header_footer_table_4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT COUNT(*) FROM header_footer_table_4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+8
+PREHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice is NULL
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice is NULL
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+PREHOOK: query: SELECT AVG(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT AVG(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+8.0
+16.5
+4.333333333333333
+Warning: Shuffle Join MERGEJOIN[11][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM header_footer_table_4 A, header_footer_table_4 B ORDER BY A.header_int, B.header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 A, header_footer_table_4 B ORDER BY A.header_int, B.header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 faith yearly 1 faith yearly
+1 faith yearly 3 barry yearly
+1 faith yearly 5 chelsea monthly
+1 faith yearly 8 xavier monthly
+1 faith yearly 9 derek yearly
+1 faith yearly 11 ethan monthly
+1 faith yearly 12 alex daily
+1 faith yearly 21 yves daily
+3 barry yearly 1 faith yearly
+3 barry yearly 3 barry yearly
+3 barry yearly 5 chelsea monthly
+3 barry yearly 8 xavier monthly
+3 barry yearly 9 derek yearly
+3 barry yearly 11 ethan monthly
+3 barry yearly 12 alex daily
+3 barry yearly 21 yves daily
+5 chelsea monthly 1 faith yearly
+5 chelsea monthly 3 barry yearly
+5 chelsea monthly 5 chelsea monthly
+5 chelsea monthly 8 xavier monthly
+5 chelsea monthly 9 derek yearly
+5 chelsea monthly 11 ethan monthly
+5 chelsea monthly 12 alex daily
+5 chelsea monthly 21 yves daily
+8 xavier monthly 1 faith yearly
+8 xavier monthly 3 barry yearly
+8 xavier monthly 5 chelsea monthly
+8 xavier monthly 8 xavier monthly
+8 xavier monthly 9 derek yearly
+8 xavier monthly 11 ethan monthly
+8 xavier monthly 12 alex daily
+8 xavier monthly 21 yves daily
+9 derek yearly 1 faith yearly
+9 derek yearly 3 barry yearly
+9 derek yearly 5 chelsea monthly
+9 derek yearly 8 xavier monthly
+9 derek yearly 9 derek yearly
+9 derek yearly 11 ethan monthly
+9 derek yearly 12 alex daily
+9 derek yearly 21 yves daily
+11 ethan monthly 1 faith yearly
+11 ethan monthly 3 barry yearly
+11 ethan monthly 5 chelsea monthly
+11 ethan monthly 8 xavier monthly
+11 ethan monthly 9 derek yearly
+11 ethan monthly 11 ethan monthly
+11 ethan monthly 12 alex daily
+11 ethan monthly 21 yves daily
+12 alex daily 1 faith yearly
+12 alex daily 3 barry yearly
+12 alex daily 5 chelsea monthly
+12 alex daily 8 xavier monthly
+12 alex daily 9 derek yearly
+12 alex daily 11 ethan monthly
+12 alex daily 12 alex daily
+12 alex daily 21 yves daily
+21 yves daily 1 faith yearly
+21 yves daily 3 barry yearly
+21 yves daily 5 chelsea monthly
+21 yves daily 8 xavier monthly
+21 yves daily 9 derek yearly
+21 yves daily 11 ethan monthly
+21 yves daily 12 alex daily
+21 yves daily 21 yves daily
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 LEFT JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 LEFT JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+faith 1
+barry 3
+chelsea 5
+xavier 8
+derek 9
+ethan 11
+alex 12
+yves 21
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 RIGHT JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 RIGHT JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+NULL NULL
+faith 1
+NULL NULL
+barry 3
+NULL NULL
+chelsea 5
+NULL NULL
+NULL NULL
+xavier 8
+derek 9
+NULL NULL
+ethan 11
+alex 12
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 INNER JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 INNER JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+faith 1
+barry 3
+chelsea 5
+xavier 8
+derek 9
+ethan 11
+alex 12
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 FULL JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 FULL JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+NULL NULL
+faith 1
+NULL NULL
+barry 3
+NULL NULL
+chelsea 5
+NULL NULL
+NULL NULL
+xavier 8
+derek 9
+NULL NULL
+ethan 11
+alex 12
+yves 21
+PREHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+monthly 24
+daily 33
+yearly 13
+PREHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+monthly 24
+daily 33
+yearly 13
+PREHOOK: query: SELECT header_name, header_choice FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_choice FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+faith yearly
+barry yearly
+chelsea monthly
+xavier monthly
+derek yearly
+ethan monthly
+alex daily
+yves daily
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@transition
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@transition
+PREHOOK: query: INSERT INTO transition SELECT header_choice, header_name FROM header_footer_table_4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: default@transition
+POSTHOOK: query: INSERT INTO transition SELECT header_choice, header_name FROM header_footer_table_4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: default@transition
+POSTHOOK: Lineage: transition.name EXPRESSION [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_name, type:string, comment:null), ]
+POSTHOOK: Lineage: transition.title SIMPLE [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_choice, type:varchar(10), comment:null), ]
+Warning: Shuffle Join MERGEJOIN[11][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM transition A, transition B ORDER BY A.title, A.name, B.title, B.name
+PREHOOK: type: QUERY
+PREHOOK: Input: default@transition
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM transition A, transition B ORDER BY A.title, A.name, B.title, B.name
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@transition
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+daily alex daily alex
+daily alex daily yves
+daily alex monthly chelsea
+daily alex monthly ethan
+daily alex monthly xavier
+daily alex yearly barry
+daily alex yearly derek
+daily alex yearly faith
+daily yves daily alex
+daily yves daily yves
+daily yves monthly chelsea
+daily yves monthly ethan
+daily yves monthly xavier
+daily yves yearly barry
+daily yves yearly derek
+daily yves yearly faith
+monthly chelsea daily alex
+monthly chelsea daily yves
+monthly chelsea monthly chelsea
+monthly chelsea monthly ethan
+monthly chelsea monthly xavier
+monthly chelsea yearly barry
+monthly chelsea yearly derek
+monthly chelsea yearly faith
+monthly ethan daily alex
+monthly ethan daily yves
+monthly ethan monthly chelsea
+monthly ethan monthly ethan
+monthly ethan monthly xavier
+monthly ethan yearly barry
+monthly ethan yearly derek
+monthly ethan yearly faith
+monthly xavier daily alex
+monthly xavier daily yves
+monthly xavier monthly chelsea
+monthly xavier monthly ethan
+monthly xavier monthly xavier
+monthly xavier yearly barry
+monthly xavier yearly derek
+monthly xavier yearly faith
+yearly barry daily alex
+yearly barry daily yves
+yearly barry monthly chelsea
+yearly barry monthly ethan
+yearly barry monthly xavier
+yearly barry yearly barry
+yearly barry yearly derek
+yearly barry yearly faith
+yearly derek daily alex
+yearly derek daily yves
+yearly derek monthly chelsea
+yearly derek monthly ethan
+yearly derek monthly xavier
+yearly derek yearly barry
+yearly derek yearly derek
+yearly derek yearly faith
+yearly faith daily alex
+yearly faith daily yves
+yearly faith monthly chelsea
+yearly faith monthly ethan
+yearly faith monthly xavier
+yearly faith yearly barry
+yearly faith yearly derek
+yearly faith yearly faith
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@transition2
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@transition2
+PREHOOK: query: INSERT INTO transition2 SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: default@transition2
+POSTHOOK: query: INSERT INTO transition2 SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: default@transition2
+POSTHOOK: Lineage: transition2.header_choice SIMPLE [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_choice, type:varchar(10), comment:null), ]
+POSTHOOK: Lineage: transition2.sum_header_int EXPRESSION [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_int, type:int, comment:null), ]
+Warning: Shuffle Join MERGEJOIN[11][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM transition2 A, transition2 B ORDER BY A.sum_header_int, A.header_choice, B.sum_header_int, B.header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@transition2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM transition2 A, transition2 B ORDER BY A.sum_header_int, A.header_choice, B.sum_header_int, B.header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@transition2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+yearly 13 yearly 13
+yearly 13 monthly 24
+yearly 13 daily 33
+monthly 24 yearly 13
+monthly 24 monthly 24
+monthly 24 daily 33
+daily 33 yearly 13
+daily 33 monthly 24
+daily 33 daily 33
+PREHOOK: query: DROP TABLE transition
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@transition
+PREHOOK: Output: default@transition
+POSTHOOK: query: DROP TABLE transition
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@transition
+POSTHOOK: Output: default@transition
+PREHOOK: query: DROP TABLE transition2
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@transition2
+PREHOOK: Output: default@transition2
+POSTHOOK: query: DROP TABLE transition2
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@transition2
+POSTHOOK: Output: default@transition2
+PREHOOK: query: SELECT * FROM header_footer_table_4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+12 alex daily
+3 barry yearly
+5 chelsea monthly
+8 xavier monthly
+9 derek yearly
+11 ethan monthly
+1 faith yearly
+21 yves daily
+PREHOOK: query: SELECT * FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 faith yearly
+3 barry yearly
+5 chelsea monthly
+8 xavier monthly
+9 derek yearly
+11 ethan monthly
+12 alex daily
+21 yves daily
+PREHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'header_choice'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'header_choice'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+PREHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'monthly'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice = 'monthly'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+5 chelsea monthly
+8 xavier monthly
+11 ethan monthly
+PREHOOK: query: SELECT COUNT(*) FROM header_footer_table_4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT COUNT(*) FROM header_footer_table_4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+8
+PREHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice is NULL
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 WHERE header_choice is NULL
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+PREHOOK: query: SELECT AVG(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT AVG(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+8.0
+16.5
+4.333333333333333
+Warning: Shuffle Join MERGEJOIN[11][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM header_footer_table_4 A, header_footer_table_4 B ORDER BY A.header_int, B.header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM header_footer_table_4 A, header_footer_table_4 B ORDER BY A.header_int, B.header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 faith yearly 1 faith yearly
+1 faith yearly 3 barry yearly
+1 faith yearly 5 chelsea monthly
+1 faith yearly 8 xavier monthly
+1 faith yearly 9 derek yearly
+1 faith yearly 11 ethan monthly
+1 faith yearly 12 alex daily
+1 faith yearly 21 yves daily
+3 barry yearly 1 faith yearly
+3 barry yearly 3 barry yearly
+3 barry yearly 5 chelsea monthly
+3 barry yearly 8 xavier monthly
+3 barry yearly 9 derek yearly
+3 barry yearly 11 ethan monthly
+3 barry yearly 12 alex daily
+3 barry yearly 21 yves daily
+5 chelsea monthly 1 faith yearly
+5 chelsea monthly 3 barry yearly
+5 chelsea monthly 5 chelsea monthly
+5 chelsea monthly 8 xavier monthly
+5 chelsea monthly 9 derek yearly
+5 chelsea monthly 11 ethan monthly
+5 chelsea monthly 12 alex daily
+5 chelsea monthly 21 yves daily
+8 xavier monthly 1 faith yearly
+8 xavier monthly 3 barry yearly
+8 xavier monthly 5 chelsea monthly
+8 xavier monthly 8 xavier monthly
+8 xavier monthly 9 derek yearly
+8 xavier monthly 11 ethan monthly
+8 xavier monthly 12 alex daily
+8 xavier monthly 21 yves daily
+9 derek yearly 1 faith yearly
+9 derek yearly 3 barry yearly
+9 derek yearly 5 chelsea monthly
+9 derek yearly 8 xavier monthly
+9 derek yearly 9 derek yearly
+9 derek yearly 11 ethan monthly
+9 derek yearly 12 alex daily
+9 derek yearly 21 yves daily
+11 ethan monthly 1 faith yearly
+11 ethan monthly 3 barry yearly
+11 ethan monthly 5 chelsea monthly
+11 ethan monthly 8 xavier monthly
+11 ethan monthly 9 derek yearly
+11 ethan monthly 11 ethan monthly
+11 ethan monthly 12 alex daily
+11 ethan monthly 21 yves daily
+12 alex daily 1 faith yearly
+12 alex daily 3 barry yearly
+12 alex daily 5 chelsea monthly
+12 alex daily 8 xavier monthly
+12 alex daily 9 derek yearly
+12 alex daily 11 ethan monthly
+12 alex daily 12 alex daily
+12 alex daily 21 yves daily
+21 yves daily 1 faith yearly
+21 yves daily 3 barry yearly
+21 yves daily 5 chelsea monthly
+21 yves daily 8 xavier monthly
+21 yves daily 9 derek yearly
+21 yves daily 11 ethan monthly
+21 yves daily 12 alex daily
+21 yves daily 21 yves daily
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 LEFT JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 LEFT JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+faith 1
+barry 3
+chelsea 5
+xavier 8
+derek 9
+ethan 11
+alex 12
+yves 21
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 RIGHT JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 RIGHT JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+NULL NULL
+faith 1
+NULL NULL
+barry 3
+NULL NULL
+chelsea 5
+NULL NULL
+NULL NULL
+xavier 8
+derek 9
+NULL NULL
+ethan 11
+alex 12
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 INNER JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 INNER JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+faith 1
+barry 3
+chelsea 5
+xavier 8
+derek 9
+ethan 11
+alex 12
+PREHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 FULL JOIN numbrs ON numbr = header_int
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Input: default@numbrs
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_int FROM header_footer_table_4 FULL JOIN numbrs ON numbr = header_int
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Input: default@numbrs
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+NULL NULL
+faith 1
+NULL NULL
+barry 3
+NULL NULL
+chelsea 5
+NULL NULL
+NULL NULL
+xavier 8
+derek 9
+NULL NULL
+ethan 11
+alex 12
+yves 21
+PREHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+monthly 24
+daily 33
+yearly 13
+PREHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+monthly 24
+daily 33
+yearly 13
+PREHOOK: query: SELECT header_name, header_choice FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT header_name, header_choice FROM header_footer_table_4 ORDER BY header_int LIMIT 8
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+faith yearly
+barry yearly
+chelsea monthly
+xavier monthly
+derek yearly
+ethan monthly
+alex daily
+yves daily
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@transition
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@transition
+PREHOOK: query: INSERT INTO transition SELECT header_choice, header_name FROM header_footer_table_4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: default@transition
+POSTHOOK: query: INSERT INTO transition SELECT header_choice, header_name FROM header_footer_table_4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: default@transition
+POSTHOOK: Lineage: transition.name EXPRESSION [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_name, type:string, comment:null), ]
+POSTHOOK: Lineage: transition.title SIMPLE [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_choice, type:varchar(10), comment:null), ]
+Warning: Shuffle Join MERGEJOIN[11][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM transition A, transition B ORDER BY A.title, A.name, B.title, B.name
+PREHOOK: type: QUERY
+PREHOOK: Input: default@transition
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM transition A, transition B ORDER BY A.title, A.name, B.title, B.name
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@transition
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+daily alex daily alex
+daily alex daily yves
+daily alex monthly chelsea
+daily alex monthly ethan
+daily alex monthly xavier
+daily alex yearly barry
+daily alex yearly derek
+daily alex yearly faith
+daily yves daily alex
+daily yves daily yves
+daily yves monthly chelsea
+daily yves monthly ethan
+daily yves monthly xavier
+daily yves yearly barry
+daily yves yearly derek
+daily yves yearly faith
+monthly chelsea daily alex
+monthly chelsea daily yves
+monthly chelsea monthly chelsea
+monthly chelsea monthly ethan
+monthly chelsea monthly xavier
+monthly chelsea yearly barry
+monthly chelsea yearly derek
+monthly chelsea yearly faith
+monthly ethan daily alex
+monthly ethan daily yves
+monthly ethan monthly chelsea
+monthly ethan monthly ethan
+monthly ethan monthly xavier
+monthly ethan yearly barry
+monthly ethan yearly derek
+monthly ethan yearly faith
+monthly xavier daily alex
+monthly xavier daily yves
+monthly xavier monthly chelsea
+monthly xavier monthly ethan
+monthly xavier monthly xavier
+monthly xavier yearly barry
+monthly xavier yearly derek
+monthly xavier yearly faith
+yearly barry daily alex
+yearly barry daily yves
+yearly barry monthly chelsea
+yearly barry monthly ethan
+yearly barry monthly xavier
+yearly barry yearly barry
+yearly barry yearly derek
+yearly barry yearly faith
+yearly derek daily alex
+yearly derek daily yves
+yearly derek monthly chelsea
+yearly derek monthly ethan
+yearly derek monthly xavier
+yearly derek yearly barry
+yearly derek yearly derek
+yearly derek yearly faith
+yearly faith daily alex
+yearly faith daily yves
+yearly faith monthly chelsea
+yearly faith monthly ethan
+yearly faith monthly xavier
+yearly faith yearly barry
+yearly faith yearly derek
+yearly faith yearly faith
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@transition2
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@transition2
+PREHOOK: query: INSERT INTO transition2 SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@header_footer_table_4
+PREHOOK: Output: default@transition2
+POSTHOOK: query: INSERT INTO transition2 SELECT header_choice, SUM(header_int) FROM header_footer_table_4 GROUP BY header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@header_footer_table_4
+POSTHOOK: Output: default@transition2
+POSTHOOK: Lineage: transition2.header_choice SIMPLE [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_choice, type:varchar(10), comment:null), ]
+POSTHOOK: Lineage: transition2.sum_header_int EXPRESSION [(header_footer_table_4)header_footer_table_4.FieldSchema(name:header_int, type:int, comment:null), ]
+Warning: Shuffle Join MERGEJOIN[11][tables = [$hdt$_0, $hdt$_1]] in Stage 'Reducer 2' is a cross product
+PREHOOK: query: SELECT * FROM transition2 A, transition2 B ORDER BY A.sum_header_int, A.header_choice, B.sum_header_int, B.header_choice
+PREHOOK: type: QUERY
+PREHOOK: Input: default@transition2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM transition2 A, transition2 B ORDER BY A.sum_header_int, A.header_choice, B.sum_header_int, B.header_choice
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@transition2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+yearly 13 yearly 13
+yearly 13 monthly 24
+yearly 13 daily 33
+monthly 24 yearly 13
+monthly 24 monthly 24
+monthly 24 daily 33
+daily 33 yearly 13
+daily 33 monthly 24
+daily 33 daily 33
diff --git a/ql/src/test/results/clientpositive/llap/skip_header_footer_proj.q.out b/ql/src/test/results/clientpositive/llap/skip_header_footer_proj.q.out
new file mode 100644
index 0000000..f78f7fb
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/skip_header_footer_proj.q.out
@@ -0,0 +1,123 @@
+PREHOOK: query: DROP TABLE IF EXISTS hf1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS hf1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE hf1 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='1')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@hf1
+POSTHOOK: query: CREATE TABLE hf1 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='1')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@hf1
+PREHOOK: query: INSERT OVERWRITE TABLE hf1 VALUES ('x','y'),('a','b'),('c','d')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@hf1
+POSTHOOK: query: INSERT OVERWRITE TABLE hf1 VALUES ('x','y'),('a','b'),('c','d')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@hf1
+POSTHOOK: Lineage: hf1.a SCRIPT []
+POSTHOOK: Lineage: hf1.b SCRIPT []
+PREHOOK: query: SELECT * FROM hf1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hf1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM hf1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hf1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+a b
+c d
+PREHOOK: query: DROP TABLE IF EXISTS hf2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS hf2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE hf2 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.footer.line.count'='2')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@hf2
+POSTHOOK: query: CREATE TABLE hf2 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.footer.line.count'='2')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@hf2
+PREHOOK: query: INSERT OVERWRITE TABLE hf2 VALUES ('x','y'),('a','b'),('c','d')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@hf2
+POSTHOOK: query: INSERT OVERWRITE TABLE hf2 VALUES ('x','y'),('a','b'),('c','d')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@hf2
+POSTHOOK: Lineage: hf2.a SCRIPT []
+POSTHOOK: Lineage: hf2.b SCRIPT []
+PREHOOK: query: SELECT * FROM hf2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hf2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM hf2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hf2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+x y
+PREHOOK: query: DROP TABLE IF EXISTS hf3
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS hf3
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE hf3 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='3')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@hf3
+POSTHOOK: query: CREATE TABLE hf3 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='3')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@hf3
+PREHOOK: query: INSERT OVERWRITE TABLE hf3 VALUES ('x','y'),('a','b'),('c','d')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@hf3
+POSTHOOK: query: INSERT OVERWRITE TABLE hf3 VALUES ('x','y'),('a','b'),('c','d')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@hf3
+POSTHOOK: Lineage: hf3.a SCRIPT []
+POSTHOOK: Lineage: hf3.b SCRIPT []
+PREHOOK: query: SELECT * FROM hf3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hf3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM hf3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hf3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+PREHOOK: query: DROP TABLE IF EXISTS hf4
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS hf4
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE hf4 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='1','skip.footer.line.count'='2')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@hf4
+POSTHOOK: query: CREATE TABLE hf4 (a string, b string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES('skip.header.line.count'='1','skip.footer.line.count'='2')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@hf4
+PREHOOK: query: INSERT OVERWRITE TABLE hf4 VALUES ('x','y'),('a','b'),('c','d')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@hf4
+POSTHOOK: query: INSERT OVERWRITE TABLE hf4 VALUES ('x','y'),('a','b'),('c','d')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@hf4
+POSTHOOK: Lineage: hf4.a SCRIPT []
+POSTHOOK: Lineage: hf4.b SCRIPT []
+PREHOOK: query: SELECT * FROM hf4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hf4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: SELECT * FROM hf4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hf4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
diff --git a/ql/src/test/results/clientpositive/tez/compressed_skip_header_footer_aggr.q.out b/ql/src/test/results/clientpositive/tez/compressed_skip_header_footer_aggr.q.out
new file mode 100644
index 0000000..a42e75e
--- /dev/null
+++ b/ql/src/test/results/clientpositive/tez/compressed_skip_header_footer_aggr.q.out
@@ -0,0 +1,362 @@
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase1`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase1
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase1`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase1
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase2`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase2
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase2`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase2
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase3`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase3
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase3`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase3
+PREHOOK: query: select * from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+3 2019-12-31
+PREHOOK: query: select count(*) from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31
+3 2019-12-31
+PREHOOK: query: select count(*) from testcase2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase2
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase2
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31
+2 2019-12-31
+PREHOOK: query: select count(*) from testcase3
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase3
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase3
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase3
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase4`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase4
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase4`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase4
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase5`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase5
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase5`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase5
+PREHOOK: query: CREATE EXTERNAL TABLE `testcase6`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase6
+POSTHOOK: query: CREATE EXTERNAL TABLE `testcase6`(id int, name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
+#### A masked pattern was here ####
+ TBLPROPERTIES ("skip.header.line.count"="0", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase6
+PREHOOK: query: select * from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+3 2019-12-31 02
+PREHOOK: query: select count(*) from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31 00
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase4
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase4
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase4
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase4
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1
+PREHOOK: query: select * from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2 2019-12-31 01
+3 2019-12-31 02
+PREHOOK: query: select count(*) from testcase5
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase5
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase5
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase5
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 2019-12-31 00
+2 2019-12-31 01
+PREHOOK: query: select count(*) from testcase6
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase6
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase6
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase6
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: create table testcase_gz(age int, name string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+PREHOOK: type: CREATETABLE
+PREHOOK: Input: hdfs://### HDFS PATH ###
+PREHOOK: Output: database:default
+PREHOOK: Output: default@testcase_gz
+POSTHOOK: query: create table testcase_gz(age int, name string)
+ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
+#### A masked pattern was here ####
+TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="1")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Input: hdfs://### HDFS PATH ###
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@testcase_gz
+PREHOOK: query: select * from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 a
+2 b
+PREHOOK: query: select count(*) from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2
+PREHOOK: query: select * from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1 a
+2 b
+PREHOOK: query: select count(*) from testcase_gz
+PREHOOK: type: QUERY
+PREHOOK: Input: default@testcase_gz
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select count(*) from testcase_gz
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@testcase_gz
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2