diff --git common/src/java/org/apache/hadoop/hive/conf/HiveConf.java common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index 65ec1b9..068996c 100644 --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -1967,11 +1967,35 @@ public void setSparkConfigUpdated(boolean isSparkConfigUpdated) { "This flag should be set to true to enable vectorized mode of query execution.\n" + "The default value is false."), HIVE_VECTORIZATION_REDUCE_ENABLED("hive.vectorized.execution.reduce.enabled", true, - "This flag should be set to true to enable vectorized mode of the reduce-side of query execution.\n" + - "The default value is true."), + "This flag should be set to true to enable vectorized mode of the reduce-side of query execution.\n" + + "The default value is true."), HIVE_VECTORIZATION_REDUCE_GROUPBY_ENABLED("hive.vectorized.execution.reduce.groupby.enabled", true, - "This flag should be set to true to enable vectorized mode of the reduce-side GROUP BY query execution.\n" + - "The default value is true."), + "This flag should be set to true to enable vectorized mode of the reduce-side GROUP BY query execution.\n" + + "The default value is true."), + HIVE_VECTORIZATION_MAPJOIN_NATIVE_ENABLED("hive.vectorized.execution.mapjoin.native.enabled", true, + "This flag should be set to true to enable native (i.e. non-pass through) vectorization\n" + + "of queries using MapJoin.\n" + + "The default value is true."), + HIVE_VECTORIZATION_MAPJOIN_NATIVE_MULTIKEY_ONLY_ENABLED("hive.vectorized.execution.mapjoin.native.multikey.only.enabled", false, + "This flag should be set to true to restrict use of native vector map join hash tables to\n" + + "the MultiKey in queries using MapJoin.\n" + + "The default value is false."), + HIVE_VECTORIZATION_MAPJOIN_NATIVE_MINMAX_ENABLED("hive.vectorized.execution.mapjoin.minmax.enabled", false, + "This flag should be set to true to enable vector map join hash tables to\n" + + "use max / max filtering for integer join queries using MapJoin.\n" + + "The default value is false."), + HIVE_VECTORIZATION_MAPJOIN_NATIVE_OVERFLOW_BATCH_ONLY("hive.vectorized.execution.mapjoin.overflow.batch.only", false, + "This flag should be set to true to make vector map join hash tables\n" + + "use only use the overflow vectorized row batch for join queries using MapJoin.\n" + + "The default value is false."), + HIVE_VECTORIZATION_MAPJOIN_NATIVE_OVERFLOW_REPEATED_THRESHOLD("hive.vectorized.execution.mapjoin.overflow.repeated.threshold", -1, + "The number of small table rows for a match in vector map join hash tables\n" + + "where we use the repeated field optimization in overflow vectorized row batch for join queries using MapJoin.\n" + + "A value of -1 means do use the join result optimization. Otherwise, threshold value can be 0 to maximum integer."), + HIVE_VECTORIZATION_MAPJOIN_NATIVE_FAST_HASHTABLE_ENABLED("hive.vectorized.execution.mapjoin.native.fast.hashtable.enabled", false, + "This flag should be set to true to enable use of native fast vector map join hash tables in\n" + + "queries using MapJoin.\n" + + "The default value is false."), HIVE_VECTORIZATION_GROUPBY_CHECKINTERVAL("hive.vectorized.groupby.checkinterval", 100000, "Number of entries added to the group by aggregation hash before a recomputation of average entry size is performed."), HIVE_VECTORIZATION_GROUPBY_MAXENTRIES("hive.vectorized.groupby.maxentries", 1000000, diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java index 38d72f5..52a86c4 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/MapJoinOperator.java @@ -84,14 +84,14 @@ protected transient MapJoinTableContainer[] mapJoinTables; private transient MapJoinTableContainerSerDe[] mapJoinTableSerdes; private transient boolean hashTblInitedOnce; - private transient ReusableGetAdaptor[] hashMapRowGetters; + protected transient ReusableGetAdaptor[] hashMapRowGetters; private UnwrapRowContainer[] unwrapContainer; private transient Configuration hconf; private transient boolean hybridMapJoinLeftover; // whether there's spilled data to be processed - private transient MapJoinBytesTableContainer currentSmallTable; // reloaded hashmap from disk - private transient int tag; // big table alias - private transient int smallTable; // small table alias + protected transient MapJoinBytesTableContainer currentSmallTable; // reloaded hashmap from disk + protected transient int tag; // big table alias + protected transient int smallTable; // small table alias public MapJoinOperator() { } @@ -115,6 +115,10 @@ public void startGroup() throws HiveException { defaultStartGroup(); } + protected HashTableLoader getHashTableLoader(Configuration hconf) { + return HashTableLoaderFactory.getLoader(hconf); + } + @Override protected Collection> initializeOp(Configuration hconf) throws HiveException { this.hconf = hconf; @@ -133,7 +137,7 @@ public void startGroup() throws HiveException { + "__HASH_MAP_"+this.getOperatorId()+"_container"; cache = ObjectCacheFactory.getCache(hconf); - loader = HashTableLoaderFactory.getLoader(hconf); + loader = getHashTableLoader(hconf); hashMapRowGetters = null; @@ -266,7 +270,7 @@ public void generateMapMetaData() throws HiveException { } } - private Pair loadHashTable( + protected Pair loadHashTable( ExecMapperContext mapContext, MapredContext mrContext) throws HiveException { loadCalled = true; @@ -280,6 +284,7 @@ public void generateMapMetaData() throws HiveException { } perfLogger.PerfLogBegin(CLASS_NAME, PerfLogger.LOAD_HASHTABLE); + LOG.info(this.getClass().getSimpleName() + " loading from loader " + loader.getClass().getSimpleName() + " cacheKey " + cacheKey); loader.init(mapContext, mrContext, hconf, this); long memUsage = (long)(MapJoinMemoryExhaustionHandler.getMaxHeapSize() * conf.getHashTableMemoryUsage()); @@ -518,7 +523,7 @@ private void continueProcess(HashPartition partition, HybridHashTableContainer h * @throws HiveException * @throws SerDeException */ - private void reloadHashTable(HashPartition partition, + protected void reloadHashTable(HashPartition partition, HybridHashTableContainer hybridHtContainer) throws IOException, ClassNotFoundException, HiveException, SerDeException { @@ -566,8 +571,9 @@ private void reloadHashTable(HashPartition partition, * Iterate over the big table row container and feed process() with leftover rows * @param partition the hash partition being brought back to memory at the moment * @throws HiveException + * @throws IOException */ - protected void reProcessBigTable(HashPartition partition) throws HiveException { + protected void reProcessBigTable(HashPartition partition) throws HiveException, IOException { ObjectContainer bigTable = partition.getMatchfileObjContainer(); while (bigTable.hasNext()) { Object row = bigTable.next(); diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/OperatorFactory.java ql/src/java/org/apache/hadoop/hive/ql/exec/OperatorFactory.java index 91e8a02..c4554a7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/OperatorFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/OperatorFactory.java @@ -153,21 +153,25 @@ public OpTuple(Class descClass, Class> opClass) { } } + public static Operator getVectorOperator( + Class> opClass, T conf, VectorizationContext vContext) throws HiveException { + try { + Operator op = (Operator) opClass.getDeclaredConstructor( + VectorizationContext.class, OperatorDesc.class).newInstance( + vContext, conf); + return op; + } catch (Exception e) { + e.printStackTrace(); + throw new HiveException(e); + } + } public static Operator getVectorOperator(T conf, VectorizationContext vContext) throws HiveException { Class descClass = (Class) conf.getClass(); for (OpTuple o : vectorOpvec) { if (o.descClass == descClass) { - try { - Operator op = (Operator) o.opClass.getDeclaredConstructor( - VectorizationContext.class, OperatorDesc.class).newInstance( - vContext, conf); - return op; - } catch (Exception e) { - e.printStackTrace(); - throw new HiveException(e); - } + return getVectorOperator(o.opClass, conf, vContext); } } throw new HiveException("No vector operator for descriptor class " diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java index 67477c2..31713a9 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java @@ -35,9 +35,11 @@ import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator; import org.apache.hadoop.hive.ql.exec.JoinUtil; import org.apache.hadoop.hive.ql.exec.Utilities; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinBytesTableContainer.KeyValueHelper; import org.apache.hadoop.hive.ql.exec.vector.VectorHashKeyWrapper; import org.apache.hadoop.hive.ql.exec.vector.VectorHashKeyWrapperBatch; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriter; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinRowBytesContainer; import org.apache.hadoop.hive.ql.io.HiveKey; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.serde2.ByteStream.Output; @@ -65,7 +67,8 @@ * Partitions that can fit in memory will be processed first, and then every spilled partition will * be restored and processed one by one. */ -public class HybridHashTableContainer implements MapJoinTableContainer { +public class HybridHashTableContainer + implements MapJoinTableContainer, MapJoinTableContainerDirectAccess { private static final Log LOG = LogFactory.getLog(HybridHashTableContainer.class); private final HashPartition[] hashPartitions; // an array of partitions holding the triplets @@ -83,6 +86,7 @@ private LazyBinaryStructObjectInspector internalValueOi; private boolean[] sortableSortOrders; private MapJoinBytesTableContainer.KeyValueHelper writeHelper; + private MapJoinBytesTableContainer.DirectKeyValueWriter directWriteHelper; private final List EMPTY_LIST = new ArrayList(0); @@ -94,6 +98,8 @@ BytesBytesMultiHashMap hashMap; // In memory hashMap KeyValueContainer sidefileKVContainer; // Stores small table key/value pairs ObjectContainer matchfileObjContainer; // Stores big table rows + VectorMapJoinRowBytesContainer matchfileRowBytesContainer; + // Stores big table rows as bytes for native vector map join. Path hashMapLocalPath; // Local file system path for spilled hashMap boolean hashMapOnDisk; // Status of hashMap. true: on disk, false: in memory boolean hashMapSpilledOnCreation; // When there's no enough memory, cannot create hashMap @@ -162,6 +168,14 @@ public ObjectContainer getMatchfileObjContainer() { return matchfileObjContainer; } + /* Get the big table row bytes container for native vector map join */ + public VectorMapJoinRowBytesContainer getMatchfileRowBytesContainer() { + if (matchfileRowBytesContainer == null) { + matchfileRowBytesContainer = new VectorMapJoinRowBytesContainer(); + } + return matchfileRowBytesContainer; + } + /* Check if hashmap is on disk or in memory */ public boolean isHashMapOnDisk() { return hashMapOnDisk; @@ -272,9 +286,14 @@ public MapJoinKey putRow(MapJoinObjectSerDeContext keyContext, Writable currentK } } writeHelper.setKeyValue(currentKey, currentValue); + return internalPutRow(writeHelper, currentKey, currentValue); + } + + private MapJoinKey internalPutRow(KeyValueHelper keyValueHelper, + Writable currentKey, Writable currentValue) throws SerDeException, IOException { // Next, put row into corresponding hash partition - int keyHash = writeHelper.getHashFromKey(); + int keyHash = keyValueHelper.getHashFromKey(); int partitionId = keyHash & (hashPartitions.length - 1); HashPartition hashPartition = hashPartitions[partitionId]; @@ -282,7 +301,7 @@ public MapJoinKey putRow(MapJoinObjectSerDeContext keyContext, Writable currentK KeyValueContainer kvContainer = hashPartition.getSidefileKVContainer(); kvContainer.add((HiveKey) currentKey, (BytesWritable) currentValue); } else { - hashPartition.hashMap.put(writeHelper, keyHash); // Pass along hashcode to avoid recalculation + hashPartition.hashMap.put(keyValueHelper, keyHash); // Pass along hashcode to avoid recalculation totalInMemRowCount++; if ((totalInMemRowCount & (this.memoryCheckFrequency - 1)) == 0 && // check periodically @@ -499,9 +518,21 @@ public void seal() { } } + + // Direct access interfaces. + + @Override + public void put(Writable currentKey, Writable currentValue) throws SerDeException, IOException { + if (directWriteHelper == null) { + directWriteHelper = new MapJoinBytesTableContainer.DirectKeyValueWriter(); + } + directWriteHelper.setKeyValue(currentKey, currentValue); + internalPutRow(directWriteHelper, currentKey, currentValue); + } + /** Implementation of ReusableGetAdaptor that has Output for key serialization; row * container is also created once and reused for every row. */ - private class GetAdaptor implements ReusableGetAdaptor { + private class GetAdaptor implements ReusableGetAdaptor, ReusableGetAdaptorDirectAccess { private Object[] currentKey; private boolean[] nulls; @@ -581,6 +612,19 @@ public MapJoinRowContainer getCurrentRows() { public Object[] getCurrentKey() { return currentKey; } + + // Direct access interfaces. + + @Override + public JoinUtil.JoinResult setDirect(byte[] bytes, int offset, int length, + BytesBytesMultiHashMap.Result hashMapResult) { + return currentValue.setDirect(bytes, offset, length, hashMapResult); + } + + @Override + public int directSpillPartitionId() { + return currentValue.directSpillPartitionId(); + } } /** Row container that gets and deserializes the rows on demand from bytes provided. */ @@ -743,6 +787,34 @@ public void addRow(Object[] value) { public void write(MapJoinObjectSerDeContext valueContext, ObjectOutputStream out) { throw new RuntimeException(this.getClass().getCanonicalName() + " cannot be serialized"); } + + // Direct access. + + public JoinUtil.JoinResult setDirect(byte[] bytes, int offset, int length, + BytesBytesMultiHashMap.Result hashMapResult) { + + int keyHash = WriteBuffers.murmurHash(bytes, offset, length); + partitionId = keyHash & (hashPartitions.length - 1); + + // If the target hash table is on disk, spill this row to disk as well to be processed later + if (isOnDisk(partitionId)) { + return JoinUtil.JoinResult.SPILL; + } + else { + aliasFilter = hashPartitions[partitionId].hashMap.getValueResult(bytes, offset, length, hashMapResult); + dummyRow = null; + if (hashMapResult.hasRows()) { + return JoinUtil.JoinResult.MATCH; + } else { + aliasFilter = (byte) 0xff; + return JoinUtil.JoinResult.NOMATCH; + } + } + } + + public int directSpillPartitionId() { + return partitionId; + } } @Override diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinBytesTableContainer.java ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinBytesTableContainer.java index 3fdabea..df306eb 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinBytesTableContainer.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinBytesTableContainer.java @@ -29,6 +29,7 @@ import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator; import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; import org.apache.hadoop.hive.ql.exec.vector.VectorHashKeyWrapper; import org.apache.hadoop.hive.ql.exec.vector.VectorHashKeyWrapperBatch; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriter; @@ -54,6 +55,7 @@ import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; import org.apache.hadoop.io.BinaryComparable; +import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.Writable; /** @@ -61,7 +63,8 @@ * BytesBytesMultiHashMap, with very low memory overhead. However, * there may be some perf overhead when retrieving rows. */ -public class MapJoinBytesTableContainer implements MapJoinTableContainer { +public class MapJoinBytesTableContainer + implements MapJoinTableContainer, MapJoinTableContainerDirectAccess { private static final Log LOG = LogFactory.getLog(MapJoinTableContainer.class); private final BytesBytesMultiHashMap hashMap; @@ -75,6 +78,7 @@ */ private boolean[] sortableSortOrders; private KeyValueHelper writeHelper; + private DirectKeyValueWriter directWriteHelper; private final List EMPTY_LIST = new ArrayList(0); @@ -294,6 +298,48 @@ public byte updateStateByte(Byte previousValue) { } } + /* + * An implementation of KvSource that can handle key and value as BytesWritable objects. + */ + protected static class DirectKeyValueWriter implements KeyValueHelper { + + private BytesWritable key; + private BytesWritable val; + + @Override + public void setKeyValue(Writable key, Writable val) throws SerDeException { + this.key = (BytesWritable) key; + this.val = (BytesWritable) val; + } + + @Override + public void writeKey(RandomAccessOutput dest) throws SerDeException { + byte[] keyBytes = key.getBytes(); + int keyLength = key.getLength(); + dest.write(keyBytes, 0, keyLength); + } + + @Override + public void writeValue(RandomAccessOutput dest) throws SerDeException { + byte[] valueBytes = val.getBytes(); + int valueLength = val.getLength(); + dest.write(valueBytes, 0 , valueLength); + } + + @Override + public byte updateStateByte(Byte previousValue) { + // Not used by the direct access client -- native vector map join. + throw new UnsupportedOperationException("Updating the state by not supported"); + } + + @Override + public int getHashFromKey() throws SerDeException { + byte[] keyBytes = key.getBytes(); + int keyLength = key.getLength(); + return WriteBuffers.murmurHash(keyBytes, 0, keyLength); + } + } + @SuppressWarnings("deprecation") @Override public MapJoinKey putRow(MapJoinObjectSerDeContext keyContext, Writable currentKey, @@ -342,9 +388,20 @@ public void seal() { hashMap.seal(); } + // Direct access interfaces. + + @Override + public void put(Writable currentKey, Writable currentValue) throws SerDeException { + if (directWriteHelper == null) { + directWriteHelper = new DirectKeyValueWriter(); + } + directWriteHelper.setKeyValue(currentKey, currentValue); + hashMap.put(directWriteHelper, -1); + } + /** Implementation of ReusableGetAdaptor that has Output for key serialization; row * container is also created once and reused for every row. */ - private class GetAdaptor implements ReusableGetAdaptor { + private class GetAdaptor implements ReusableGetAdaptor, ReusableGetAdaptorDirectAccess { private Object[] currentKey; private boolean[] nulls; @@ -424,6 +481,19 @@ public MapJoinRowContainer getCurrentRows() { public Object[] getCurrentKey() { return currentKey; } + + // Direct access interfaces. + + @Override + public JoinUtil.JoinResult setDirect(byte[] bytes, int offset, int length, + BytesBytesMultiHashMap.Result hashMapResult) { + return currentValue.setDirect(bytes, offset, length, hashMapResult); + } + + @Override + public int directSpillPartitionId() { + throw new UnsupportedOperationException("Getting the spill hash partition not supported"); + } } /** Row container that gets and deserializes the rows on demand from bytes provided. */ @@ -573,6 +643,22 @@ public void addRow(Object[] value) { public void write(MapJoinObjectSerDeContext valueContext, ObjectOutputStream out) { throw new RuntimeException(this.getClass().getCanonicalName() + " cannot be serialized"); } + + // Direct access. + + public JoinUtil.JoinResult setDirect(byte[] bytes, int offset, int length, + BytesBytesMultiHashMap.Result hashMapResult) { + + int keyHash = WriteBuffers.murmurHash(bytes, offset, length); + aliasFilter = hashMap.getValueResult(bytes, offset, length, hashMapResult); + dummyRow = null; + if (hashMapResult.hasRows()) { + return JoinUtil.JoinResult.MATCH; + } else { + aliasFilter = (byte) 0xff; + return JoinUtil.JoinResult.NOMATCH; + } + } } public static boolean isSupportedKey(ObjectInspector keyOi) { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinKey.java ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinKey.java index 0738842..02f25e7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinKey.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinKey.java @@ -42,6 +42,9 @@ import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; import org.apache.hadoop.io.Writable; /** @@ -96,6 +99,17 @@ public static boolean isSupportedField(ObjectInspector foi) { return true; } + public static boolean isSupportedField(String typeName) { + TypeInfo typeInfo = TypeInfoUtils.getTypeInfoFromTypeString(typeName); + + if (typeInfo.getCategory() != Category.PRIMITIVE) return false; // not supported + PrimitiveTypeInfo primitiveTypeInfo = (PrimitiveTypeInfo) typeInfo; + PrimitiveCategory pc = primitiveTypeInfo.getPrimitiveCategory(); + if (!SUPPORTED_PRIMITIVES.contains(pc)) return false; // not supported + return true; + } + + public static MapJoinKey readFromVector(Output output, MapJoinKey key, Object[] keyObject, List keyOIs, boolean mayReuseKey) throws HiveException { MapJoinKeyObject result = mayReuseKey ? (MapJoinKeyObject)key : new MapJoinKeyObject(); diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinTableContainerDirectAccess.java ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinTableContainerDirectAccess.java new file mode 100644 index 0000000..2164d38 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/MapJoinTableContainerDirectAccess.java @@ -0,0 +1,31 @@ +/** + * 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.exec.persistence; + + +import java.io.IOException; + +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.io.Writable; + +public interface MapJoinTableContainerDirectAccess { + + void put(Writable currentKey, Writable currentValue) throws SerDeException, IOException; + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/ReusableGetAdaptorDirectAccess.java ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/ReusableGetAdaptorDirectAccess.java new file mode 100644 index 0000000..0685d84 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/ReusableGetAdaptorDirectAccess.java @@ -0,0 +1,30 @@ +/** + * 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.exec.persistence; + + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; + +public interface ReusableGetAdaptorDirectAccess { + + JoinResult setDirect(byte[] bytes, int offset, int length, + BytesBytesMultiHashMap.Result hashMapResult); + + int directSpillPartitionId(); +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java index 9034253..ba5a797 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/tez/HashTableLoader.java @@ -110,6 +110,8 @@ public void load(MapJoinTableContainer[] mapJoinTables, if (!MapJoinBytesTableContainer.isSupportedKey(keyOi)) { if (isFirstKey) { useOptimizedTables = false; + LOG.info(describeOi("Not using optimized hash table. " + + "Only a subset of mapjoin keys is supported. Unsupported key: ", keyOi)); } else { throw new HiveException(describeOi( "Only a subset of mapjoin keys is supported. Unsupported key: ", keyOi)); @@ -125,6 +127,7 @@ public void load(MapJoinTableContainer[] mapJoinTables, desc.getParentDataSizes().get(pos)) : new MapJoinBytesTableContainer(hconf, valCtx, keyCount, memUsage)) : new HashMapWrapper(hconf, keyCount); + LOG.info("Using tableContainer " + tableContainer.getClass().getSimpleName()); while (kvReader.next()) { tableContainer.putRow(keyCtx, (Writable)kvReader.getCurrentKey(), diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/tez/ReduceRecordSource.java ql/src/java/org/apache/hadoop/hive/ql/exec/tez/ReduceRecordSource.java index 1236df5..cdabe3a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/tez/ReduceRecordSource.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/tez/ReduceRecordSource.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hive.ql.exec.tez; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; @@ -28,6 +29,9 @@ import org.apache.hadoop.hive.ql.exec.CommonMergeJoinOperator; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.exec.Utilities; +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorDeserializeRow; import org.apache.hadoop.hive.ql.exec.vector.VectorizedBatchUtil; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatchCtx; @@ -40,6 +44,9 @@ import org.apache.hadoop.hive.serde2.SerDe; import org.apache.hadoop.hive.serde2.SerDeException; import org.apache.hadoop.hive.serde2.SerDeUtils; +import org.apache.hadoop.hive.serde2.binarysortable.BinarySortableSerDe; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableDeserializeRead; +import org.apache.hadoop.hive.serde2.lazybinary.fast.LazyBinaryDeserializeRead; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; @@ -47,7 +54,6 @@ import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.io.BytesWritable; -import org.apache.hadoop.io.DataOutputBuffer; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.StringUtils; @@ -85,13 +91,15 @@ private boolean vectorized = false; - private DataOutputBuffer keyBuffer; - private DataOutputBuffer valueBuffer; + private VectorDeserializeRow keyBinarySortableDeserializeToRow; + + private VectorDeserializeRow valueLazyBinaryDeserializeToRow; + private VectorizedRowBatchCtx batchContext; private VectorizedRowBatch batch; // number of columns pertaining to keys in a vectorized row batch - private int keysColumnOffset; + private int firstValueColumnOffset; private final int BATCH_SIZE = VectorizedRowBatch.DEFAULT_SIZE; private StructObjectInspector keyStructInspector; @@ -134,9 +142,7 @@ void init(JobConf jconf, Operator reducer, boolean vectorized, TableDesc keyT if(vectorized) { keyStructInspector = (StructObjectInspector) keyObjectInspector; - keysColumnOffset = keyStructInspector.getAllStructFieldRefs().size(); - keyBuffer = new DataOutputBuffer(); - valueBuffer = new DataOutputBuffer(); + firstValueColumnOffset = keyStructInspector.getAllStructFieldRefs().size(); } // We should initialize the SerDe with the TypeInfo when available. @@ -153,7 +159,7 @@ void init(JobConf jconf, Operator reducer, boolean vectorized, TableDesc keyT /* vectorization only works with struct object inspectors */ valueStructInspectors = (StructObjectInspector) valueObjectInspector; - final int totalColumns = keysColumnOffset + + final int totalColumns = firstValueColumnOffset + valueStructInspectors.getAllStructFieldRefs().size(); valueStringWriters = new ArrayList(totalColumns); valueStringWriters.addAll(Arrays @@ -183,6 +189,36 @@ void init(JobConf jconf, Operator reducer, boolean vectorized, TableDesc keyT batchContext = new VectorizedRowBatchCtx(); batchContext.init(vectorScratchColumnTypeMap, (StructObjectInspector) rowObjectInspector); batch = batchContext.createVectorizedRowBatch(); + + // Setup vectorized deserialization for the key and value. + BinarySortableSerDe binarySortableSerDe = (BinarySortableSerDe) inputKeyDeserializer; + + keyBinarySortableDeserializeToRow = + new VectorDeserializeRow( + new BinarySortableDeserializeRead( + VectorizedBatchUtil.primitiveTypeInfosFromStructObjectInspector( + keyStructInspector), + binarySortableSerDe.getSortOrders())); + keyBinarySortableDeserializeToRow.init(0); + + final int valuesSize = valueStructInspectors.getAllStructFieldRefs().size(); + if (valuesSize > 0) { + valueLazyBinaryDeserializeToRow = + new VectorDeserializeRow( + new LazyBinaryDeserializeRead( + VectorizedBatchUtil.primitiveTypeInfosFromStructObjectInspector( + valueStructInspectors))); + valueLazyBinaryDeserializeToRow.init(firstValueColumnOffset); + + // Create data buffers for value bytes column vectors. + for (int i = firstValueColumnOffset; i < batch.numCols; i++) { + ColumnVector colVector = batch.cols[i]; + if (colVector instanceof BytesColumnVector) { + BytesColumnVector bytesColumnVector = (BytesColumnVector) colVector; + bytesColumnVector.initBuffer(); + } + } + } } else { ois.add(keyObjectInspector); ois.add(valueObjectInspector); @@ -209,9 +245,12 @@ public final boolean isGrouped() { @Override public boolean pushRecord() throws HiveException { - BytesWritable keyWritable; - if (!vectorized && groupIterator.hasNext()) { + if (vectorized) { + return pushRecordVector(); + } + + if (groupIterator.hasNext()) { // if we have records left in the group we push one of those groupIterator.next(); return true; @@ -220,11 +259,11 @@ public boolean pushRecord() throws HiveException { try { if (!reader.next()) { return false; - } else { - keyWritable = (BytesWritable) reader.getCurrentKey(); - valueWritables = reader.getCurrentValues(); } + BytesWritable keyWritable = (BytesWritable) reader.getCurrentKey(); + valueWritables = reader.getCurrentValues(); + //Set the key, check if this is a new group or same group try { keyObject = inputKeyDeserializer.deserialize(keyWritable); @@ -248,13 +287,9 @@ public boolean pushRecord() throws HiveException { reducer.setGroupKeyObject(keyObject); } - if(vectorized) { - processVectors(valueWritables, tag); - } else { - groupIterator.initialize(valueWritables, keyObject, tag); - if (groupIterator.hasNext()) { - groupIterator.next(); // push first record of group - } + groupIterator.initialize(valueWritables, keyObject, tag); + if (groupIterator.hasNext()) { + groupIterator.next(); // push first record of group } return true; } catch (Throwable e) { @@ -338,37 +373,82 @@ public void next() throws HiveException { } } + private boolean pushRecordVector() { + try { + if (!reader.next()) { + return false; + } + + BytesWritable keyWritable = (BytesWritable) reader.getCurrentKey(); + valueWritables = reader.getCurrentValues(); + + // Check if this is a new group or same group + if (handleGroupKey && !keyWritable.equals(this.groupKey)) { + // If a operator wants to do some work at the beginning of a group + if (groupKey == null) { // the first group + this.groupKey = new BytesWritable(); + } else { + // If a operator wants to do some work at the end of a group + reducer.endGroup(); + } + + groupKey.set(keyWritable.getBytes(), 0, keyWritable.getLength()); + reducer.startGroup(); + } + + processVectorGroup(keyWritable, valueWritables, tag); + return true; + } catch (Throwable e) { + abort = true; + if (e instanceof OutOfMemoryError) { + // Don't create a new object if we are already out of memory + throw (OutOfMemoryError) e; + } else { + l4j.fatal(StringUtils.stringifyException(e)); + throw new RuntimeException(e); + } + } + } + /** * @param values * @return true if it is not done and can take more inputs */ - private void processVectors(Iterable values, byte tag) throws HiveException { - /* deserialize key into columns */ - VectorizedBatchUtil.addRowToBatchFrom(keyObject, keyStructInspector, - 0, 0, batch, keyBuffer); - for(int i = 0; i < keysColumnOffset; i++) { + private void processVectorGroup(BytesWritable keyWritable, + Iterable values, byte tag) throws HiveException, IOException { + + // Deserialize key into vector row columns. + // Since we referencing byte column vector byte arrays by reference, we don't need + // a data buffer. + byte[] keyBytes = keyWritable.getBytes(); + int keyLength = keyWritable.getLength(); + keyBinarySortableDeserializeToRow.setBytes(keyBytes, 0, keyLength); + keyBinarySortableDeserializeToRow.deserializeByValue(batch, 0); + for(int i = 0; i < firstValueColumnOffset; i++) { VectorizedBatchUtil.setRepeatingColumn(batch, i); } int rowIdx = 0; try { for (Object value : values) { - /* deserialize value into columns */ - BytesWritable valueWritable = (BytesWritable) value; - Object valueObj = deserializeValue(valueWritable, tag); - - VectorizedBatchUtil.addRowToBatchFrom(valueObj, valueStructInspectors, - rowIdx, keysColumnOffset, batch, valueBuffer); + if (valueLazyBinaryDeserializeToRow != null) { + // Deserialize value into vector row columns. + BytesWritable valueWritable = (BytesWritable) value; + byte[] valueBytes = valueWritable.getBytes(); + int valueLength = valueWritable.getLength(); + valueLazyBinaryDeserializeToRow.setBytes(valueBytes, 0, valueLength); + valueLazyBinaryDeserializeToRow.deserializeByValue(batch, rowIdx); + } rowIdx++; if (rowIdx >= BATCH_SIZE) { VectorizedBatchUtil.setBatchSize(batch, rowIdx); reducer.process(batch, tag); // Reset just the value columns and value buffer. - for (int i = keysColumnOffset; i < batch.numCols; i++) { + for (int i = firstValueColumnOffset; i < batch.numCols; i++) { + // Note that reset also resets the data buffer for bytes column vectors. batch.cols[i].reset(); } - valueBuffer.reset(); rowIdx = 0; } } @@ -378,8 +458,6 @@ private void processVectors(Iterable values, byte tag) throws HiveExcept reducer.process(batch, tag); } batch.reset(); - keyBuffer.reset(); - valueBuffer.reset(); } catch (Exception e) { String rowString = null; try { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAppMasterEventOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAppMasterEventOperator.java index 7aa279a..df82d21 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAppMasterEventOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorAppMasterEventOperator.java @@ -23,14 +23,14 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.ql.exec.AppMasterEventOperator; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriter; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriterFactory; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.AppMasterEventDesc; import org.apache.hadoop.hive.ql.plan.OperatorDesc; import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.io.ObjectWritable; +import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.io.Writable; /** @@ -40,14 +40,23 @@ private static final long serialVersionUID = 1L; - protected transient Object[] singleRow; + private VectorizationContext vContext; + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- - protected transient VectorExpressionWriter[] valueWriters; + private transient boolean firstBatch; + + private transient VectorExtractRowDynBatch vectorExtractRowDynBatch; + + protected transient Object[] singleRow; - public VectorAppMasterEventOperator(VectorizationContext context, + public VectorAppMasterEventOperator(VectorizationContext vContext, OperatorDesc conf) { super(); this.conf = (AppMasterEventDesc) conf; + this.vContext = vContext; } public VectorAppMasterEventOperator() { @@ -55,70 +64,76 @@ public VectorAppMasterEventOperator() { @Override public Collection> initializeOp(Configuration hconf) throws HiveException { + + // We need a input object inspector that is for the row we will extract out of the + // vectorized row batch, not for example, an original inspector for an ORC table, etc. + inputObjInspectors[0] = + VectorizedBatchUtil.convertToStandardStructObjectInspector((StructObjectInspector) inputObjInspectors[0]); + + // Call AppMasterEventOperator with new input inspector. Collection> result = super.initializeOp(hconf); - valueWriters = VectorExpressionWriterFactory.getExpressionWriters( - (StructObjectInspector) inputObjInspectors[0]); - singleRow = new Object[valueWriters.length]; + assert result.isEmpty(); + + firstBatch = true; + return result; } @Override public void process(Object data, int tag) throws HiveException { - VectorizedRowBatch vrg = (VectorizedRowBatch) data; + if (hasReachedMaxSize) { + return; + } - Writable [] records = null; - Writable recordValue = null; - boolean vectorizedSerde = false; + VectorizedRowBatch batch = (VectorizedRowBatch) data; + if (firstBatch) { + vectorExtractRowDynBatch = new VectorExtractRowDynBatch(); + vectorExtractRowDynBatch.init((StructObjectInspector) inputObjInspectors[0], vContext.getProjectedColumns()); - try { - if (serializer instanceof VectorizedSerde) { - recordValue = ((VectorizedSerde) serializer).serializeVector(vrg, - inputObjInspectors[0]); - records = (Writable[]) ((ObjectWritable) recordValue).get(); - vectorizedSerde = true; - } - } catch (SerDeException e1) { - throw new HiveException(e1); + singleRow = new Object[vectorExtractRowDynBatch.getCount()]; + + firstBatch = false; } - for (int i = 0; i < vrg.size; i++) { - Writable row = null; - if (vectorizedSerde) { - row = records[i]; - } else { - if (vrg.valueWriters == null) { - vrg.setValueWriters(this.valueWriters); - } - try { - row = serializer.serialize(getRowObject(vrg, i), inputObjInspectors[0]); - } catch (SerDeException ex) { - throw new HiveException(ex); + vectorExtractRowDynBatch.setBatchOnEntry(batch); + + ObjectInspector rowInspector = inputObjInspectors[0]; + try { + Writable writableRow; + if (batch.selectedInUse) { + int selected[] = batch.selected; + for (int logical = 0 ; logical < batch.size; logical++) { + int batchIndex = selected[logical]; + vectorExtractRowDynBatch.extractRow(batchIndex, singleRow); + writableRow = serializer.serialize(singleRow, rowInspector); + writableRow.write(buffer); + if (buffer.getLength() > MAX_SIZE) { + LOG.info("Disabling AM events. Buffer size too large: " + buffer.getLength()); + hasReachedMaxSize = true; + buffer = null; + break; + } } - } - try { - row.write(buffer); - if (buffer.getLength() > MAX_SIZE) { - LOG.info("Disabling AM events. Buffer size too large: " + buffer.getLength()); - hasReachedMaxSize = true; - buffer = null; + } else { + for (int batchIndex = 0 ; batchIndex < batch.size; batchIndex++) { + vectorExtractRowDynBatch.extractRow(batchIndex, singleRow); + writableRow = serializer.serialize(singleRow, rowInspector); + writableRow.write(buffer); + if (buffer.getLength() > MAX_SIZE) { + LOG.info("Disabling AM events. Buffer size too large: " + buffer.getLength()); + hasReachedMaxSize = true; + buffer = null; + break; + } } - } catch (Exception e) { - throw new HiveException(e); } + } catch (Exception e) { + throw new HiveException(e); } - } - private Object[] getRowObject(VectorizedRowBatch vrg, int rowIndex) - throws HiveException { - int batchIndex = rowIndex; - if (vrg.selectedInUse) { - batchIndex = vrg.selected[rowIndex]; - } - for (int i = 0; i < vrg.projectionSize; i++) { - ColumnVector vectorColumn = vrg.cols[vrg.projectedColumns[i]]; - singleRow[i] = vrg.valueWriters[i].writeValue(vectorColumn, batchIndex); - } - return singleRow; + forward(data, rowInspector); + + vectorExtractRowDynBatch.forgetBatchOnExit(); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorColumnOrderedMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorColumnOrderedMap.java index 96a4f83..d2eb26a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorColumnOrderedMap.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorColumnOrderedMap.java @@ -84,7 +84,7 @@ public VectorColumnOrderedMap() { public void add(int orderedColumn, int valueColumn, String typeName) { if (orderedTreeMap.containsKey(orderedColumn)) { - throw new Error("Duplicate column " + orderedColumn + " in ordered column map"); + throw new RuntimeException("Duplicate column " + orderedColumn + " in ordered column map"); } orderedTreeMap.put(orderedColumn, new Value(valueColumn, typeName)); } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorCopyRow.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorCopyRow.java index e010e45..0058141 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorCopyRow.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorCopyRow.java @@ -210,7 +210,7 @@ public void init(VectorColumnMapping columnMapping) { } else if (VectorizationContext.decimalTypePattern.matcher(typeName).matches()){ copyRowByValue = new DecimalCopyRow(inputColumn, outputColumn); } else { - throw new Error("Cannot allocate vector copy row for " + typeName); + throw new RuntimeException("Cannot allocate vector copy row for " + typeName); } subRowToBatchCopiersByValue[i] = copyRowByValue; if (copyRowByReference == null) { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java index 22106c6..8452abd 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorDeserializeRow.java @@ -651,11 +651,22 @@ public void init(int[] outputColumns) throws HiveException { } } + public void init(List outputColumns) throws HiveException { + + readersByValue = new Reader[primitiveTypeInfos.length]; + readersByReference = new Reader[primitiveTypeInfos.length]; + + for (int i = 0; i < primitiveTypeInfos.length; i++) { + int outputColumn = outputColumns.get(i); + addReader(i, outputColumn); + } + } + public void init(int startColumn) throws HiveException { readersByValue = new Reader[primitiveTypeInfos.length]; readersByReference = new Reader[primitiveTypeInfos.length]; - + for (int i = 0; i < primitiveTypeInfos.length; i++) { int outputColumn = startColumn + i; addReader(i, outputColumn); diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorFileSinkOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorFileSinkOperator.java index bfa8134..2ccc9a5 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorFileSinkOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorFileSinkOperator.java @@ -23,12 +23,9 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.ql.exec.FileSinkOperator; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriter; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriterFactory; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.FileSinkDesc; import org.apache.hadoop.hive.ql.plan.OperatorDesc; -import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; /** @@ -38,14 +35,23 @@ private static final long serialVersionUID = 1L; - protected transient Object[] singleRow; + private VectorizationContext vContext; + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- - protected transient VectorExpressionWriter[] valueWriters; + private transient boolean firstBatch; - public VectorFileSinkOperator(VectorizationContext context, + private transient VectorExtractRowDynBatch vectorExtractRowDynBatch; + + protected transient Object[] singleRow; + + public VectorFileSinkOperator(VectorizationContext vContext, OperatorDesc conf) { super(); this.conf = (FileSinkDesc) conf; + this.vContext = vContext; } public VectorFileSinkOperator() { @@ -54,43 +60,49 @@ public VectorFileSinkOperator() { @Override protected Collection> initializeOp(Configuration hconf) throws HiveException { + // We need a input object inspector that is for the row we will extract out of the // vectorized row batch, not for example, an original inspector for an ORC table, etc. - VectorExpressionWriterFactory.processVectorInspector( - (StructObjectInspector) inputObjInspectors[0], - new VectorExpressionWriterFactory.SingleOIDClosure() { - @Override - public void assign(VectorExpressionWriter[] writers, - ObjectInspector objectInspector) { - valueWriters = writers; - inputObjInspectors[0] = objectInspector; - } - }); - singleRow = new Object[valueWriters.length]; + inputObjInspectors[0] = + VectorizedBatchUtil.convertToStandardStructObjectInspector((StructObjectInspector) inputObjInspectors[0]); // Call FileSinkOperator with new input inspector. - return super.initializeOp(hconf); + Collection> result = super.initializeOp(hconf); + assert result.isEmpty(); + + firstBatch = true; + + return result; } @Override public void process(Object data, int tag) throws HiveException { - VectorizedRowBatch vrg = (VectorizedRowBatch)data; - for (int i = 0; i < vrg.size; i++) { - Object[] row = getRowObject(vrg, i); - super.process(row, tag); - } - } + VectorizedRowBatch batch = (VectorizedRowBatch) data; + if (firstBatch) { + vectorExtractRowDynBatch = new VectorExtractRowDynBatch(); + vectorExtractRowDynBatch.init((StructObjectInspector) inputObjInspectors[0], vContext.getProjectedColumns()); + + singleRow = new Object[vectorExtractRowDynBatch.getCount()]; - private Object[] getRowObject(VectorizedRowBatch vrg, int rowIndex) - throws HiveException { - int batchIndex = rowIndex; - if (vrg.selectedInUse) { - batchIndex = vrg.selected[rowIndex]; + firstBatch = false; } - for (int i = 0; i < vrg.projectionSize; i++) { - ColumnVector vectorColumn = vrg.cols[vrg.projectedColumns[i]]; - singleRow[i] = valueWriters[i].writeValue(vectorColumn, batchIndex); + + vectorExtractRowDynBatch.setBatchOnEntry(batch); + + if (batch.selectedInUse) { + int selected[] = batch.selected; + for (int logical = 0 ; logical < batch.size; logical++) { + int batchIndex = selected[logical]; + vectorExtractRowDynBatch.extractRow(batchIndex, singleRow); + super.process(singleRow, tag); + } + } else { + for (int batchIndex = 0 ; batchIndex < batch.size; batchIndex++) { + vectorExtractRowDynBatch.extractRow(batchIndex, singleRow); + super.process(singleRow, tag); + } } - return singleRow; + + vectorExtractRowDynBatch.forgetBatchOnExit(); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorGroupByOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorGroupByOperator.java index bd4fb42..39a83e3 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorGroupByOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorGroupByOperator.java @@ -102,7 +102,7 @@ private transient VectorizedRowBatch outputBatch; private transient VectorizedRowBatchCtx vrbCtx; - private transient VectorColumnAssign[] vectorColumnAssign; + private transient VectorAssignRowSameBatch vectorAssignRowSameBatch; private transient int numEntriesHashTable; @@ -776,6 +776,7 @@ public VectorGroupByOperator() { @Override protected Collection> initializeOp(Configuration hconf) throws HiveException { Collection> result = super.initializeOp(hconf); + assert result.isEmpty(); List objectInspectors = new ArrayList(); @@ -812,11 +813,12 @@ public VectorGroupByOperator() { outputObjInspector = ObjectInspectorFactory.getStandardStructObjectInspector( outputFieldNames, objectInspectors); if (isVectorOutput) { - vrbCtx = new VectorizedRowBatchCtx(); - vrbCtx.init(vOutContext.getScratchColumnTypeMap(), (StructObjectInspector) outputObjInspector); - outputBatch = vrbCtx.createVectorizedRowBatch(); - vectorColumnAssign = VectorColumnAssignFactory.buildAssigners( - outputBatch, outputObjInspector, vOutContext.getProjectionColumnMap(), conf.getOutputColumnNames()); + vrbCtx = new VectorizedRowBatchCtx(); + vrbCtx.init(vOutContext.getScratchColumnTypeMap(), (StructObjectInspector) outputObjInspector); + outputBatch = vrbCtx.createVectorizedRowBatch(); + vectorAssignRowSameBatch = new VectorAssignRowSameBatch(); + vectorAssignRowSameBatch.init((StructObjectInspector) outputObjInspector, vOutContext.getProjectedColumns()); + vectorAssignRowSameBatch.setOneBatch(outputBatch); } } catch (HiveException he) { @@ -902,12 +904,12 @@ private void writeSingleRow(VectorHashKeyWrapper kw, VectorAggregationBufferRow } else { // Output keys and aggregates into the output batch. for (int i = 0; i < outputKeyLength; ++i) { - vectorColumnAssign[fi++].assignObjectValue(keyWrappersBatch.getWritableKeyValue ( - kw, i, keyOutputWriters[i]), outputBatch.size); + vectorAssignRowSameBatch.assignRowColumn(outputBatch.size, fi++, + keyWrappersBatch.getWritableKeyValue (kw, i, keyOutputWriters[i])); } for (int i = 0; i < aggregators.length; ++i) { - vectorColumnAssign[fi++].assignObjectValue(aggregators[i].evaluateOutput( - agg.getAggregationBuffer(i)), outputBatch.size); + vectorAssignRowSameBatch.assignRowColumn(outputBatch.size, fi++, + aggregators[i].evaluateOutput(agg.getAggregationBuffer(i))); } ++outputBatch.size; if (outputBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { @@ -927,8 +929,8 @@ private void writeGroupRow(VectorAggregationBufferRow agg, DataOutputBuffer buff throws HiveException { int fi = outputKeyLength; // Start after group keys. for (int i = 0; i < aggregators.length; ++i) { - vectorColumnAssign[fi++].assignObjectValue(aggregators[i].evaluateOutput( - agg.getAggregationBuffer(i)), outputBatch.size); + vectorAssignRowSameBatch.assignRowColumn(outputBatch.size, fi++, + aggregators[i].evaluateOutput(agg.getAggregationBuffer(i))); } ++outputBatch.size; if (outputBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorMapJoinOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorMapJoinOperator.java index bbc8d60..534a906 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorMapJoinOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorMapJoinOperator.java @@ -74,7 +74,7 @@ private transient VectorizedRowBatch outputBatch; private transient VectorizedRowBatch scratchBatch; // holds restored (from disk) big table rows private transient VectorExpressionWriter[] valueWriters; - private transient Map outputVectorAssigners; + private transient Map outputVectorAssignRowMap; // These members are used as out-of-band params // for the inner-loop supper.processOp callbacks @@ -125,6 +125,7 @@ public VectorMapJoinOperator (VectorizationContext vContext, OperatorDesc conf) @Override public Collection> initializeOp(Configuration hconf) throws HiveException { + // Code borrowed from VectorReduceSinkOperator.initializeOp VectorExpressionWriterFactory.processVectorInspector( (StructObjectInspector) inputObjInspectors[0], @@ -202,7 +203,8 @@ protected Object _evaluate(Object row, int version) throws HiveException { // Filtering is handled in the input batch processing filterMaps[posBigTable] = null; - outputVectorAssigners = new HashMap(); + outputVectorAssignRowMap = new HashMap(); + return result; } @@ -212,15 +214,16 @@ protected Object _evaluate(Object row, int version) throws HiveException { @Override protected void internalForward(Object row, ObjectInspector outputOI) throws HiveException { Object[] values = (Object[]) row; - VectorColumnAssign[] vcas = outputVectorAssigners.get(outputOI); - if (null == vcas) { - vcas = VectorColumnAssignFactory.buildAssigners( - outputBatch, outputOI, vOutContext.getProjectionColumnMap(), conf.getOutputColumnNames()); - outputVectorAssigners.put(outputOI, vcas); - } - for (int i=0; i> initializeOp(Configuration hconf) throws HiveException { + // We need a input object inspector that is for the row we will extract out of the // vectorized row batch, not for example, an original inspector for an ORC table, etc. - VectorExpressionWriterFactory.processVectorInspector( - (StructObjectInspector) inputObjInspectors[0], - new VectorExpressionWriterFactory.SingleOIDClosure() { - @Override - public void assign(VectorExpressionWriter[] writers, - ObjectInspector objectInspector) { - rowWriters = writers; - inputObjInspectors[0] = objectInspector; - } - }); - singleRow = new Object[rowWriters.length]; - - return super.initializeOp(hconf); + inputObjInspectors[0] = + VectorizedBatchUtil.convertToStandardStructObjectInspector((StructObjectInspector) inputObjInspectors[0]); + + // Call ReduceSinkOperator with new input inspector. + Collection> result = super.initializeOp(hconf); + assert result.isEmpty(); + + firstBatch = true; + + return result; } @Override public void process(Object data, int tag) throws HiveException { - VectorizedRowBatch vrg = (VectorizedRowBatch) data; - for (int batchIndex = 0 ; batchIndex < vrg.size; ++batchIndex) { - Object row = getRowObject(vrg, batchIndex); - super.process(row, tag); - } - } + VectorizedRowBatch batch = (VectorizedRowBatch) data; + if (firstBatch) { + vectorExtractRowDynBatch = new VectorExtractRowDynBatch(); + vectorExtractRowDynBatch.init((StructObjectInspector) inputObjInspectors[0], vContext.getProjectedColumns()); - private Object[] getRowObject(VectorizedRowBatch vrg, int rowIndex) - throws HiveException { - int batchIndex = rowIndex; - if (vrg.selectedInUse) { - batchIndex = vrg.selected[rowIndex]; + singleRow = new Object[vectorExtractRowDynBatch.getCount()]; + + firstBatch = false; } - for (int i = 0; i < vrg.projectionSize; i++) { - ColumnVector vectorColumn = vrg.cols[vrg.projectedColumns[i]]; - if (vectorColumn != null) { - singleRow[i] = rowWriters[i].writeValue(vectorColumn, batchIndex); - } else { - // Some columns from tables are not used. - singleRow[i] = null; + + vectorExtractRowDynBatch.setBatchOnEntry(batch); + + // VectorizedBatchUtil.debugDisplayBatch( batch, "VectorReduceSinkOperator processOp "); + + if (batch.selectedInUse) { + int selected[] = batch.selected; + for (int logical = 0 ; logical < batch.size; logical++) { + int batchIndex = selected[logical]; + vectorExtractRowDynBatch.extractRow(batchIndex, singleRow); + super.process(singleRow, tag); + } + } else { + for (int batchIndex = 0 ; batchIndex < batch.size; batchIndex++) { + vectorExtractRowDynBatch.extractRow(batchIndex, singleRow); + super.process(singleRow, tag); } } - return singleRow; + + vectorExtractRowDynBatch.forgetBatchOnExit(); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSMBMapJoinOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSMBMapJoinOperator.java index 1fe5c4e..a2f8091 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSMBMapJoinOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSMBMapJoinOperator.java @@ -73,7 +73,7 @@ private transient VectorHashKeyWrapperBatch keyWrapperBatch; - private transient Map outputVectorAssigners; + private transient Map outputVectorAssignRowMap; private transient int batchIndex = -1; @@ -141,7 +141,7 @@ public VectorSMBMapJoinOperator(VectorizationContext vContext, OperatorDesc conf keyWrapperBatch = VectorHashKeyWrapperBatch.compileKeyWrapperBatch(keyExpressions); - outputVectorAssigners = new HashMap(); + outputVectorAssignRowMap = new HashMap(); // This key evaluator translates from the vectorized VectorHashKeyWrapper format // into the row-mode MapJoinKey @@ -270,15 +270,16 @@ public void closeOp(boolean aborted) throws HiveException { @Override protected void internalForward(Object row, ObjectInspector outputOI) throws HiveException { Object[] values = (Object[]) row; - VectorColumnAssign[] vcas = outputVectorAssigners.get(outputOI); - if (null == vcas) { - vcas = VectorColumnAssignFactory.buildAssigners( - outputBatch, outputOI, vOutContext.getProjectionColumnMap(), conf.getOutputColumnNames()); - outputVectorAssigners.put(outputOI, vcas); - } - for (int i = 0; i < values.length; ++i) { - vcas[i].assignObjectValue(values[i], outputBatch.size); + VectorAssignRowSameBatch va = outputVectorAssignRowMap.get(outputOI); + if (va == null) { + va = new VectorAssignRowSameBatch(); + va.init((StructObjectInspector) outputOI, vOutContext.getProjectedColumns()); + va.setOneBatch(outputBatch); + outputVectorAssignRowMap.put(outputOI, va); } + + va.assignRow(outputBatch.size, values); + ++outputBatch.size; if (outputBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { flushOutput(); diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRow.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRow.java index ceb18c6..e2934e3 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRow.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRow.java @@ -582,6 +582,7 @@ private Writer createWriter(TypeInfo typeInfo, int columnIndex) throws HiveExcep } public void init(List typeNames, int[] columnMap) throws HiveException { + writers = new Writer[typeNames.size()]; for (int i = 0; i < typeNames.size(); i++) { String typeName = typeNames.get(i); @@ -593,6 +594,7 @@ public void init(List typeNames, int[] columnMap) throws HiveException { } public void init(List typeNames) throws HiveException { + writers = new Writer[typeNames.size()]; for (int i = 0; i < typeNames.size(); i++) { String typeName = typeNames.get(i); @@ -602,6 +604,17 @@ public void init(List typeNames) throws HiveException { } } + public void init(PrimitiveTypeInfo[] primitiveTypeInfos, List columnMap) + throws HiveException { + + writers = new Writer[primitiveTypeInfos.length]; + for (int i = 0; i < primitiveTypeInfos.length; i++) { + int columnIndex = columnMap.get(i); + Writer writer = createWriter(primitiveTypeInfos[i], columnIndex); + writers[i] = writer; + } + } + public int getCount() { return writers.length; } @@ -610,6 +623,10 @@ public void setOutput(Output output) { serializeWrite.set(output); } + public void setOutputAppend(Output output) { + serializeWrite.setAppend(output); + } + /* * Note that when serializing a row, the logical mapping using selected in use has already * been performed. batchIndex is the actual index of the row. diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRowNoNulls.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRowNoNulls.java index 4a9fdcd..1363004 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRowNoNulls.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorSerializeRowNoNulls.java @@ -355,6 +355,7 @@ private Writer createWriter(TypeInfo typeInfo, int columnIndex) throws HiveExcep } public void init(List typeNames, int[] columnMap) throws HiveException { + writers = new Writer[typeNames.size()]; for (int i = 0; i < typeNames.size(); i++) { String typeName = typeNames.get(i); @@ -366,6 +367,7 @@ public void init(List typeNames, int[] columnMap) throws HiveException { } public void init(List typeNames) throws HiveException { + writers = new Writer[typeNames.size()]; for (int i = 0; i < typeNames.size(); i++) { String typeName = typeNames.get(i); @@ -375,6 +377,17 @@ public void init(List typeNames) throws HiveException { } } + public void init(PrimitiveTypeInfo[] primitiveTypeInfos, List columnMap) + throws HiveException { + + writers = new Writer[primitiveTypeInfos.length]; + for (int i = 0; i < primitiveTypeInfos.length; i++) { + int columnIndex = columnMap.get(i); + Writer writer = createWriter(primitiveTypeInfos[i], columnIndex); + writers[i] = writer; + } + } + public int getCount() { return writers.length; } @@ -383,6 +396,10 @@ public void setOutput(Output output) { serializeWrite.set(output); } + public void setOutputAppend(Output output) { + serializeWrite.setAppend(output); + } + /* * Note that when serializing a row, the logical mapping using selected in use has already * been performed. batchIndex is the actual index of the row. diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedBatchUtil.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedBatchUtil.java index e9cf6b6..dcea8ae 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedBatchUtil.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedBatchUtil.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -581,6 +582,52 @@ public static StandardStructObjectInspector convertToStandardStructObjectInspect return result; } + public static PrimitiveTypeInfo[] primitiveTypeInfosFromTypeNames( + String[] typeNames) throws HiveException { + + PrimitiveTypeInfo[] result = new PrimitiveTypeInfo[typeNames.length]; + + for(int i = 0; i < typeNames.length; i++) { + TypeInfo typeInfo = TypeInfoUtils.getTypeInfoFromTypeString(typeNames[i]); + result[i] = (PrimitiveTypeInfo) typeInfo; + } + return result; + } + + /** + * Make a new (scratch) batch, which is exactly "like" the batch provided, except that it's empty + * @param batch the batch to imitate + * @return the new batch + * @throws HiveException + */ + public static VectorizedRowBatch makeLike(VectorizedRowBatch batch) throws HiveException { + VectorizedRowBatch newBatch = new VectorizedRowBatch(batch.numCols); + for (int i = 0; i < batch.numCols; i++) { + ColumnVector colVector = batch.cols[i]; + if (colVector != null) { + ColumnVector newColVector; + if (colVector instanceof LongColumnVector) { + newColVector = new LongColumnVector(); + } else if (colVector instanceof DoubleColumnVector) { + newColVector = new DoubleColumnVector(); + } else if (colVector instanceof BytesColumnVector) { + newColVector = new BytesColumnVector(); + } else if (colVector instanceof DecimalColumnVector) { + DecimalColumnVector decColVector = (DecimalColumnVector) colVector; + newColVector = new DecimalColumnVector(decColVector.precision, decColVector.scale); + } else { + throw new HiveException("Column vector class " + colVector.getClass().getName() + + " is not supported!"); + } + newBatch.cols[i] = newColVector; + newBatch.cols[i].init(); + } + } + newBatch.projectedColumns = Arrays.copyOf(batch.projectedColumns, batch.projectedColumns.length); + newBatch.projectionSize = batch.projectionSize; + newBatch.reset(); + return newBatch; + } public static String displayBytes(byte[] bytes, int start, int length) { StringBuilder sb = new StringBuilder(); @@ -632,7 +679,7 @@ public static void debugDisplayOneRow(VectorizedRowBatch batch, int index, Strin } sb.append(" "); } - System.out.println(sb.toString()); + LOG.info(sb.toString()); } public static void debugDisplayBatch(VectorizedRowBatch batch, String prefix) throws HiveException { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java index 77c3652..68c4df7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizedRowBatchCtx.java @@ -670,7 +670,7 @@ public static ColumnVector allocateColumnVector(String type, int defaultSize) { type.equalsIgnoreCase(serdeConstants.INTERVAL_DAY_TIME_TYPE_NAME)) { return new LongColumnVector(defaultSize); } else { - throw new Error("Cannot allocate vector column for " + type); + throw new RuntimeException("Cannot allocate vector column for " + type); } } } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IdentityExpression.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IdentityExpression.java index 56e0d39..402d0f8 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IdentityExpression.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IdentityExpression.java @@ -45,6 +45,15 @@ public void evaluate(VectorizedRowBatch batch) { } } + public static boolean isColumnOnly(VectorExpression ve) { + if (ve instanceof IdentityExpression) { + VectorExpression identityExpression = (IdentityExpression) ve; + return (identityExpression.childExpressions == null); + } else { + return false; + } + } + @Override public int getOutputColumn() { return colNum; diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java index b2798d2..bbf8862 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java @@ -453,8 +453,7 @@ public static VectorExpressionWriter genVectorExpressionWritable( case UNION: case MAP: case LIST: - throw new IllegalArgumentException("Unsupported complex type: " + - fieldObjInspector.getCategory()); + return genVectorExpressionWritableEmpty(); default: throw new IllegalArgumentException("Unknown type " + fieldObjInspector.getCategory()); @@ -1113,6 +1112,32 @@ public Object initValue(Object ignored) { }.init(fieldObjInspector); } + // For complex types like STRUCT, MAP, etc we do not support, we need a writer that + // does nothing. We assume the Vectorizer class has not validated the query to actually + // try and use the complex types. They do show up in inputObjInspector[0] and need to be + // ignored. + private static VectorExpressionWriter genVectorExpressionWritableEmpty() { + return new VectorExpressionWriterBase() { + + @Override + public Object writeValue(ColumnVector column, int row) + throws HiveException { + return null; + } + + @Override + public Object setValue(Object row, ColumnVector column, int columnRow) + throws HiveException { + return null; + } + + @Override + public Object initValue(Object ost) throws HiveException { + return null; + } + }; + } + /** * Helper function to create an array of writers from a list of expression descriptors. */ diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinCommonOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinCommonOperator.java new file mode 100644 index 0000000..b434c83 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinCommonOperator.java @@ -0,0 +1,773 @@ +/** + * 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.exec.vector.mapjoin; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Future; + +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.ql.HashTableLoaderFactory; +import org.apache.hadoop.hive.ql.exec.HashTableLoader; +import org.apache.hadoop.hive.ql.exec.MapJoinOperator; +import org.apache.hadoop.hive.ql.exec.MapredContext; +import org.apache.hadoop.hive.ql.exec.Utilities; +import org.apache.hadoop.hive.ql.exec.mr.ExecMapperContext; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainerSerDe; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorColumnMapping; +import org.apache.hadoop.hive.ql.exec.vector.VectorColumnOutputMapping; +import org.apache.hadoop.hive.ql.exec.vector.VectorColumnSourceMapping; +import org.apache.hadoop.hive.ql.exec.vector.VectorCopyRow; +import org.apache.hadoop.hive.ql.exec.vector.VectorDeserializeRow; +import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContextRegion; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedBatchUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatchCtx; +import org.apache.hadoop.hive.ql.exec.vector.expressions.IdentityExpression; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.optimized.VectorMapJoinOptimizedCreateHashTable; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTable; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.fast.VectorMapJoinFastHashTableLoader; +import org.apache.hadoop.hive.ql.log.PerfLogger; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.BaseWork; +import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; +import org.apache.hadoop.hive.ql.plan.MapJoinDesc; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableImplementationType; +import org.apache.hadoop.hive.ql.plan.api.OperatorType; +import org.apache.hadoop.hive.serde2.lazybinary.fast.LazyBinaryDeserializeRead; +import org.apache.hadoop.hive.serde2.objectinspector.StructField; +import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; + +/** + * This class is common operator class for native vectorized map join. + * + * It contain common initialization logic. + * + * It is used by both inner and outer joins. + */ +public abstract class VectorMapJoinCommonOperator extends MapJoinOperator implements VectorizationContextRegion { + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinCommonOperator.class.getName()); + + // Whether this operator is an outer join. + protected boolean isOuterJoin; + + // Position of the *single* native vector map join small table. + protected byte posSingleVectorMapJoinSmallTable; + + // The incoming vectorization context. It describes the input big table vectorized row batch. + protected VectorizationContext vContext; + + // This is the vectorized row batch description of the output of the native vectorized map join + // operator. It is based on the incoming vectorization context. Its projection may include + // a mixture of input big table columns and new scratch columns. + protected VectorizationContext vOutContext; + + // The output column projection of the vectorized row batch. And, the type names of the output + // columns. + protected int[] outputProjection; + protected String[] outputTypeNames; + + // These are the vectorized batch expressions for filtering, key expressions, and value + // expressions. + protected VectorExpression[] bigTableFilterExpressions; + protected VectorExpression[] bigTableKeyExpressions; + protected VectorExpression[] bigTableValueExpressions; + + // This is map of which vectorized row batch columns are the big table key columns. Since + // we may have key expressions that produce new scratch columns, we need a mapping. + // And, we have their type names. + protected int[] bigTableKeyColumnMap; + protected ArrayList bigTableKeyTypeNames; + + // Similarly, this is map of which vectorized row batch columns are the big table value columns. + // Since we may have value expressions that produce new scratch columns, we need a mapping. + // And, we have their type names. + protected int[] bigTableValueColumnMap; + protected ArrayList bigTableValueTypeNames; + + // This is a mapping of which big table columns (input and key/value expressions) will be + // part of the big table portion of the join output result. + protected VectorColumnOutputMapping bigTableRetainedMapping; + + // This is a mapping of which keys will be copied from the big table (input and key expressions) + // to the small table result portion of the output for outer join. + protected VectorColumnOutputMapping bigTableOuterKeyMapping; + + // This is a mapping of the values in the small table hash table that will be copied to the + // small table result portion of the output. That is, a mapping of the LazyBinary field order + // to output batch scratch columns for the small table portion. + protected VectorColumnSourceMapping smallTableMapping; + + // These are the columns in the big and small table that are ByteColumnVector columns. + // We create data buffers for these columns so we can copy strings into those columns by value. + protected int[] bigTableByteColumnVectorColumns; + protected int[] smallTableByteColumnVectorColumns; + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // For debug tracing: the name of the map or reduce task. + protected transient String taskName; + + // Whether we should only use the overflow batch for join output results. + protected transient boolean onlyUseOverflowBatch; + + // The threshold where we should use a repeating vectorized row batch optimization for + // generating join output results. + protected transient boolean useOverflowRepeatedThreshold; + protected transient int overflowRepeatedThreshold; + + // A helper object that efficiently copies the big table columns that are for the big table + // portion of the join output. + protected transient VectorCopyRow bigTableRetainedVectorCopy; + + // A helper object that efficiently copies the big table key columns (input or key expressions) + // that appear in the small table portion of the join output for outer joins. + protected transient VectorCopyRow bigTableVectorCopyOuterKeys; + + // This helper object deserializes LazyBinary format small table values into columns of a row + // in a vectorized row batch. + protected transient VectorDeserializeRow smallTableVectorDeserializeRow; + + // This a 2nd batch with the same "column schema" as the big table batch that can be used to + // build join output results in. If we can create some join output results in the big table + // batch, we will for better efficiency (i.e. avoiding copying). Otherwise, we will use the + // overflow batch. + protected transient VectorizedRowBatch overflowBatch; + + // A scratch batch that will be used to play back big table rows that were spilled + // to disk for the Hybrid Grace hash partitioning. + protected transient VectorizedRowBatch spillReplayBatch; + + // Whether the native vectorized map join operator has performed its common setup. + protected transient boolean needCommonSetup; + + // Whether the native vectorized map join operator has performed its + // native vector map join hash table setup. + protected transient boolean needHashTableSetup; + + // The small table hash table for the native vectorized map join operator. + protected transient VectorMapJoinHashTable vectorMapJoinHashTable; + + public VectorMapJoinCommonOperator() { + super(); + } + + public VectorMapJoinCommonOperator(VectorizationContext vContext, OperatorDesc conf) + throws HiveException { + super(); + + MapJoinDesc desc = (MapJoinDesc) conf; + this.conf = desc; + + this.vContext = vContext; + + /* + * Create a new vectorization context to create a new projection, but keep + * same output column manager must be inherited to track the scratch the columns. + */ + vOutContext = new VectorizationContext(getName(), this.vContext); + + order = desc.getTagOrder(); + posBigTable = (byte) desc.getPosBigTable(); + posSingleVectorMapJoinSmallTable = (order[0] == posBigTable ? order[1] : order[0]); + isOuterJoin = !desc.getNoOuterJoin(); + + Map> filterExpressions = desc.getFilters(); + bigTableFilterExpressions = vContext.getVectorExpressions(filterExpressions.get(posBigTable), + VectorExpressionDescriptor.Mode.FILTER); + + List keyDesc = desc.getKeys().get(posBigTable); + bigTableKeyExpressions = vContext.getVectorExpressions(keyDesc); + + // Since a key expression can be a calculation and the key will go into a scratch column, + // we need the mapping and type information. + bigTableKeyColumnMap = new int[bigTableKeyExpressions.length]; + bigTableKeyTypeNames = new ArrayList(); + boolean onlyColumns = true; + for (int i = 0; i < bigTableKeyColumnMap.length; i++) { + VectorExpression ve = bigTableKeyExpressions[i]; + if (!IdentityExpression.isColumnOnly(ve)) { + onlyColumns = false; + } + bigTableKeyTypeNames.add(keyDesc.get(i).getTypeString()); + bigTableKeyColumnMap[i] = ve.getOutputColumn(); + } + if (onlyColumns) { + bigTableKeyExpressions = null; + } + + List bigTableExprs = desc.getExprs().get(posBigTable); + bigTableValueExpressions = vContext.getVectorExpressions(bigTableExprs); + + /* + * Similarly, we need a mapping since a value expression can be a calculation and the value + * will go into a scratch column. + */ + bigTableValueColumnMap = new int[bigTableValueExpressions.length]; + bigTableValueTypeNames = new ArrayList(); + onlyColumns = true; + for (int i = 0; i < bigTableValueColumnMap.length; i++) { + VectorExpression ve = bigTableValueExpressions[i]; + if (!IdentityExpression.isColumnOnly(ve)) { + onlyColumns = false; + } + bigTableValueTypeNames.add(bigTableExprs.get(i).getTypeString()); + bigTableValueColumnMap[i] = ve.getOutputColumn(); + } + if (onlyColumns) { + bigTableValueExpressions = null; + } + + determineCommonInfo(isOuterJoin); + } + + protected void determineCommonInfo(boolean isOuter) { + + bigTableRetainedMapping = new VectorColumnOutputMapping(); + + bigTableOuterKeyMapping = new VectorColumnOutputMapping(); + + // The order of the fields in the LazyBinary small table value must be used, so + // we use the source ordering flavor for the mapping. + smallTableMapping = new VectorColumnSourceMapping(); + + // We use a mapping object here so we can build the projection in any order and + // get the ordered by 0 to n-1 output columns at the end. + // + // Also, to avoid copying a big table key into the small table result area for inner joins, + // we reference it with the projection so there can be duplicate output columns + // in the projection. + VectorColumnSourceMapping projectionMapping = new VectorColumnSourceMapping(); + + /* + * Gather up big and small table output result information from the MapJoinDesc. + */ + List bigTableRetainList = conf.getRetainList().get(posBigTable); + int bigTableRetainSize = bigTableRetainList.size(); + + int[] smallTableIndices; + int smallTableIndicesSize; + List smallTableExprs = conf.getExprs().get(posSingleVectorMapJoinSmallTable); + if (conf.getValueIndices() != null && conf.getValueIndices().get(posSingleVectorMapJoinSmallTable) != null) { + smallTableIndices = conf.getValueIndices().get(posSingleVectorMapJoinSmallTable); + smallTableIndicesSize = smallTableIndices.length; + } else { + smallTableIndices = null; + smallTableIndicesSize = 0; + } + + List smallTableRetainList = conf.getRetainList().get(posSingleVectorMapJoinSmallTable); + int smallTableRetainSize = smallTableRetainList.size(); + + int smallTableResultSize = 0; + if (smallTableIndicesSize > 0) { + smallTableResultSize = smallTableIndicesSize; + } else if (smallTableRetainSize > 0) { + smallTableResultSize = smallTableRetainSize; + } + + /* + * Determine the big table retained mapping first so we can optimize out (with + * projection) copying inner join big table keys in the subsequent small table results section. + */ + int nextOutputColumn = (order[0] == posBigTable ? 0 : smallTableResultSize); + for (int i = 0; i < bigTableRetainSize; i++) { + + // Since bigTableValueExpressions may do a calculation and produce a scratch column, we + // need to map to the right batch column. + + int retainColumn = bigTableRetainList.get(i); + int batchColumnIndex = bigTableValueColumnMap[retainColumn]; + String typeName = bigTableValueTypeNames.get(i); + + // With this map we project the big table batch to make it look like an output batch. + projectionMapping.add(nextOutputColumn, batchColumnIndex, typeName); + + // Collect columns we copy from the big table batch to the overflow batch. + bigTableRetainedMapping.add(batchColumnIndex, batchColumnIndex, typeName); + + nextOutputColumn++; + } + + /* + * Now determine the small table results. + */ + int firstSmallTableOutputColumn; + firstSmallTableOutputColumn = (order[0] == posBigTable ? bigTableRetainSize : 0); + int smallTableOutputCount = 0; + nextOutputColumn = firstSmallTableOutputColumn; + + // Small table indices has more information (i.e. keys) than retain, so use it if it exists... + if (smallTableIndicesSize > 0) { + smallTableOutputCount = smallTableIndicesSize; + + for (int i = 0; i < smallTableIndicesSize; i++) { + if (smallTableIndices[i] >= 0) { + + // Zero and above numbers indicate a big table key is needed for + // small table result "area". + + int keyIndex = smallTableIndices[i]; + + // Since bigTableKeyExpressions may do a calculation and produce a scratch column, we + // need to map the right column. + int batchKeyColumn = bigTableKeyColumnMap[keyIndex]; + String typeName = bigTableKeyTypeNames.get(keyIndex); + + if (!isOuter) { + + // Optimize inner join keys of small table results. + + // Project the big table key into the small table result "area". + projectionMapping.add(nextOutputColumn, batchKeyColumn, typeName); + + if (!bigTableRetainedMapping.containsOutputColumn(batchKeyColumn)) { + // If necessary, copy the big table key into the overflow batch's small table + // result "area". + bigTableRetainedMapping.add(batchKeyColumn, batchKeyColumn, typeName); + } + } else { + + // For outer joins, since the small table key can be null when there is no match, + // we must have a physical (scratch) column for those keys. We cannot use the + // projection optimization used by inner joins above. + + int scratchColumn = vOutContext.allocateScratchColumn(typeName); + projectionMapping.add(nextOutputColumn, scratchColumn, typeName); + + bigTableRetainedMapping.add(batchKeyColumn, scratchColumn, typeName); + + bigTableOuterKeyMapping.add(batchKeyColumn, scratchColumn, typeName); + } + } else { + + // Negative numbers indicate a column to be (deserialize) read from the small table's + // LazyBinary value row. + int smallTableValueIndex = -smallTableIndices[i] - 1; + + String typeName = smallTableExprs.get(i).getTypeString(); + + // Make a new big table scratch column for the small table value. + int scratchColumn = vOutContext.allocateScratchColumn(typeName); + projectionMapping.add(nextOutputColumn, scratchColumn, typeName); + + smallTableMapping.add(smallTableValueIndex, scratchColumn, typeName); + } + nextOutputColumn++; + } + } else if (smallTableRetainSize > 0) { + smallTableOutputCount = smallTableRetainSize; + + // Only small table values appear in join output result. + + for (int i = 0; i < smallTableRetainSize; i++) { + int smallTableValueIndex = smallTableRetainList.get(i); + + // Make a new big table scratch column for the small table value. + String typeName = smallTableExprs.get(i).getTypeString(); + int scratchColumn = vOutContext.allocateScratchColumn(typeName); + + projectionMapping.add(nextOutputColumn, scratchColumn, typeName); + + smallTableMapping.add(smallTableValueIndex, scratchColumn, typeName); + nextOutputColumn++; + } + } + + // Convert dynamic arrays and maps to simple arrays. + + bigTableRetainedMapping.finalize(); + + bigTableOuterKeyMapping.finalize(); + + smallTableMapping.finalize(); + + // Which big table and small table columns are ByteColumnVector and need have their data buffer + // to be manually reset for some join result processing? + + bigTableByteColumnVectorColumns = getByteColumnVectorColumns(bigTableOuterKeyMapping); + + smallTableByteColumnVectorColumns = getByteColumnVectorColumns(smallTableMapping); + + projectionMapping.finalize(); + + // Verify we added an entry for each output. + assert projectionMapping.isSourceSequenceGood(); + + outputProjection = projectionMapping.getOutputColumns(); + outputTypeNames = projectionMapping.getTypeNames(); + + if (LOG.isDebugEnabled()) { + int[] orderDisplayable = new int[order.length]; + for (int i = 0; i < order.length; i++) { + orderDisplayable[i] = (int) order[i]; + } + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor order " + Arrays.toString(orderDisplayable)); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor posBigTable " + (int) posBigTable); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor posSingleVectorMapJoinSmallTable " + (int) posSingleVectorMapJoinSmallTable); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableKeyColumnMap " + Arrays.toString(bigTableKeyColumnMap)); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableKeyTypeNames " + bigTableKeyTypeNames); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableValueColumnMap " + Arrays.toString(bigTableValueColumnMap)); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableValueTypeNames " + bigTableValueTypeNames); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor smallTableIndices " + Arrays.toString(smallTableIndices)); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor smallTableRetainList " + smallTableRetainList); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor firstSmallTableOutputColumn " + firstSmallTableOutputColumn); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor smallTableOutputCount " + smallTableOutputCount); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableRetainedMapping " + bigTableRetainedMapping.toString()); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableOuterKeyMapping " + bigTableOuterKeyMapping.toString()); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor smallTableMapping " + smallTableMapping.toString()); + + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor bigTableByteColumnVectorColumns " + Arrays.toString(bigTableByteColumnVectorColumns)); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor smallTableByteColumnVectorColumns " + Arrays.toString(smallTableByteColumnVectorColumns)); + + LOG.info(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor outputProjection " + Arrays.toString(outputProjection)); + LOG.info(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor outputTypeNames " + Arrays.toString(outputTypeNames)); + } + + setupVOutContext(conf.getOutputColumnNames()); + } + + /** + * Determine from a mapping which columns are BytesColumnVector columns. + */ + private int[] getByteColumnVectorColumns(VectorColumnMapping mapping) { + // Search mapping for any strings and return their output columns. + ArrayList list = new ArrayList(); + int count = mapping.getCount(); + int[] outputColumns = mapping.getOutputColumns(); + String[] typeNames = mapping.getTypeNames(); + for (int i = 0; i < count; i++) { + int outputColumn = outputColumns[i]; + String typeName = typeNames[i]; + if (VectorizationContext.isStringFamily(typeName)) { + list.add(outputColumn); + } + } + return ArrayUtils.toPrimitive(list.toArray(new Integer[0])); + } + + /** + * Setup the vectorized row batch description of the output of the native vectorized map join + * operator. Use the output projection we previously built from a mixture of input big table + * columns and new scratch columns. + */ + protected void setupVOutContext(List outputColumnNames) { + if (LOG.isDebugEnabled()) { + LOG.info(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor outputColumnNames " + outputColumnNames); + } + if (outputColumnNames.size() != outputProjection.length) { + throw new RuntimeException("Output column names " + outputColumnNames + " length and output projection " + Arrays.toString(outputProjection) + " / " + Arrays.toString(outputTypeNames) + " length mismatch"); + } + vOutContext.resetProjectionColumns(); + for (int i = 0; i < outputColumnNames.size(); ++i) { + String columnName = outputColumnNames.get(i); + int outputColumn = outputProjection[i]; + vOutContext.addProjectionColumn(columnName, outputColumn); + + if (LOG.isDebugEnabled()) { + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator constructor addProjectionColumn " + i + " columnName " + columnName + " outputColumn " + outputColumn); + } + } + } + + /** + * This override lets us substitute our own fast vectorized hash table loader. + */ + @Override + protected HashTableLoader getHashTableLoader(Configuration hconf) { + + VectorMapJoinDesc vectorDesc = conf.getVectorDesc(); + HashTableImplementationType hashTableImplementationType = vectorDesc.hashTableImplementationType(); + HashTableLoader hashTableLoader; + switch (vectorDesc.hashTableImplementationType()) { + case OPTIMIZED: + // Use the Tez hash table loader. + hashTableLoader = HashTableLoaderFactory.getLoader(hconf); + break; + case FAST: + // Use our specialized hash table loader. + hashTableLoader = new VectorMapJoinFastHashTableLoader(); + break; + default: + throw new RuntimeException("Unknown vector map join hash table implementation type " + hashTableImplementationType.name()); + } + return hashTableLoader; + } + + @Override + protected Collection> initializeOp(Configuration hconf) throws HiveException { + Collection> result = super.initializeOp(hconf); + + // Determine the name of our map or reduce task for debug tracing. + BaseWork work = Utilities.getMapWork(hconf); + if (work == null) { + work = Utilities.getReduceWork(hconf); + } + taskName = work.getName(); + + /* + * Get configuration parameters. + */ + onlyUseOverflowBatch = HiveConf.getBoolVar(hconf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_OVERFLOW_BATCH_ONLY); + + overflowRepeatedThreshold = HiveConf.getIntVar(hconf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_OVERFLOW_REPEATED_THRESHOLD); + useOverflowRepeatedThreshold = (overflowRepeatedThreshold >= 0); + + + /* + * Create our vectorized copy row and deserialize row helper objects. + */ + if (smallTableMapping.getCount() > 0) { + smallTableVectorDeserializeRow = new VectorDeserializeRow( + new LazyBinaryDeserializeRead( + VectorizedBatchUtil.primitiveTypeInfosFromTypeNames( + smallTableMapping.getTypeNames()))); + smallTableVectorDeserializeRow.init(smallTableMapping.getOutputColumns()); + } + + if (bigTableRetainedMapping.getCount() > 0) { + bigTableRetainedVectorCopy = new VectorCopyRow(); + bigTableRetainedVectorCopy.init(bigTableRetainedMapping); + } + + if (bigTableOuterKeyMapping.getCount() > 0) { + bigTableVectorCopyOuterKeys = new VectorCopyRow(); + bigTableVectorCopyOuterKeys.init(bigTableOuterKeyMapping); + } + + /* + * Setup the overflow batch. + */ + overflowBatch = setupOverflowBatch(); + + needCommonSetup = true; + needHashTableSetup = true; + + if (LOG.isDebugEnabled()) { + int[] currentScratchColumns = vOutContext.currentScratchColumns(); + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator initializeOp currentScratchColumns " + Arrays.toString(currentScratchColumns)); + + StructObjectInspector structOutputObjectInspector = (StructObjectInspector) outputObjInspector; + List fields = structOutputObjectInspector.getAllStructFieldRefs(); + int i = 0; + for (StructField field : fields) { + LOG.debug("VectorMapJoinInnerBigOnlyCommonOperator initializeOp " + i + " field " + field.getFieldName() + " type " + field.getFieldObjectInspector().getTypeName()); + i++; + } + } + + return result; + } + + @Override + protected Pair loadHashTable( + ExecMapperContext mapContext, MapredContext mrContext) throws HiveException { + + Pair pair; + + VectorMapJoinDesc vectorDesc = conf.getVectorDesc(); + HashTableImplementationType hashTableImplementationType = vectorDesc.hashTableImplementationType(); + HashTableLoader hashTableLoader; + switch (vectorDesc.hashTableImplementationType()) { + case OPTIMIZED: + { + // Using Tez's HashTableLoader, create either a MapJoinBytesTableContainer or + // HybridHashTableContainer. + pair = super.loadHashTable(mapContext, mrContext); + + // Create our vector map join optimized hash table variation *above* the + // map join table container. + MapJoinTableContainer[] mapJoinTableContainers = pair.getLeft(); + vectorMapJoinHashTable = VectorMapJoinOptimizedCreateHashTable.createHashTable(conf, + mapJoinTableContainers[posSingleVectorMapJoinSmallTable]); + } + break; + + case FAST: + { + // Use our VectorMapJoinFastHashTableLoader to create a VectorMapJoinTableContainer. + pair = super.loadHashTable(mapContext, mrContext); + + // Get our vector map join fast hash table variation from the + // vector map join table container. + MapJoinTableContainer[] mapJoinTableContainers = pair.getLeft(); + VectorMapJoinTableContainer vectorMapJoinTableContainer = + (VectorMapJoinTableContainer) mapJoinTableContainers[posSingleVectorMapJoinSmallTable]; + vectorMapJoinHashTable = vectorMapJoinTableContainer.vectorMapJoinHashTable(); + } + break; + default: + throw new RuntimeException("Unknown vector map join hash table implementation type " + hashTableImplementationType.name()); + } + + return pair; + } + + /* + * Setup our 2nd batch with the same "column schema" as the big table batch that can be used to + * build join output results in. + */ + protected VectorizedRowBatch setupOverflowBatch() { + VectorizedRowBatch overflowBatch; + + Map scratchColumnTypeMap = vOutContext.getScratchColumnTypeMap(); + int maxColumn = 0; + for (int i = 0; i < outputProjection.length; i++) { + int outputColumn = outputProjection[i]; + if (maxColumn < outputColumn) { + maxColumn = outputColumn; + } + } + for (int outputColumn : scratchColumnTypeMap.keySet()) { + if (maxColumn < outputColumn) { + maxColumn = outputColumn; + } + } + overflowBatch = new VectorizedRowBatch(maxColumn + 1); + + // First, just allocate just the projection columns we will be using. + for (int i = 0; i < outputProjection.length; i++) { + int outputColumn = outputProjection[i]; + String typeName = outputTypeNames[i]; + allocateOverflowBatchColumnVector(overflowBatch, outputColumn, typeName); + } + + // Now, add any scratch columns needed for children operators. + for (int outputColumn : scratchColumnTypeMap.keySet()) { + String typeName = scratchColumnTypeMap.get(outputColumn); + allocateOverflowBatchColumnVector(overflowBatch, outputColumn, typeName); + } + + overflowBatch.projectedColumns = outputProjection; + overflowBatch.projectionSize = outputProjection.length; + + overflowBatch.reset(); + + return overflowBatch; + } + + /* + * Allocate overflow batch columns by hand. + */ + private void allocateOverflowBatchColumnVector(VectorizedRowBatch overflowBatch, int outputColumn, + String typeName) { + + if (overflowBatch.cols[outputColumn] == null) { + String vectorTypeName; + if (VectorizationContext.isIntFamily(typeName) || + VectorizationContext.isDatetimeFamily(typeName)) { + vectorTypeName = "long"; + } else if (VectorizationContext.isFloatFamily(typeName)) { + vectorTypeName = "double"; + } else if (VectorizationContext.isStringFamily(typeName)) { + vectorTypeName = "string"; + } else if (VectorizationContext.decimalTypePattern.matcher(typeName).matches()){ + vectorTypeName = typeName; // Keep precision and scale. + } else { + throw new RuntimeException("Cannot determine vector type for " + typeName); + } + overflowBatch.cols[outputColumn] = VectorizedRowBatchCtx.allocateColumnVector(vectorTypeName, VectorizedRowBatch.DEFAULT_SIZE); + + if (LOG.isDebugEnabled()) { + LOG.debug(taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator initializeOp overflowBatch outputColumn " + outputColumn + " class " + overflowBatch.cols[outputColumn].getClass().getSimpleName()); + } + } + } + + /* + * Common one time setup by native vectorized map join operator's processOp. + */ + protected void commonSetup(VectorizedRowBatch batch) throws HiveException { + LOG.info("VectorMapJoinInnerCommonOperator commonSetup begin..."); + + if (LOG.isDebugEnabled()) { + displayBatchColumns(batch, "batch"); + displayBatchColumns(overflowBatch, "overflowBatch"); + } + + // Make sure big table BytesColumnVectors have room for string values in the overflow batch... + for (int column: bigTableByteColumnVectorColumns) { + BytesColumnVector bytesColumnVector = (BytesColumnVector) overflowBatch.cols[column]; + bytesColumnVector.initBuffer(); + } + + // Make sure small table BytesColumnVectors have room for string values in the big table and + // overflow batchs... + for (int column: smallTableByteColumnVectorColumns) { + BytesColumnVector bytesColumnVector = (BytesColumnVector) batch.cols[column]; + bytesColumnVector.initBuffer(); + bytesColumnVector = (BytesColumnVector) overflowBatch.cols[column]; + bytesColumnVector.initBuffer(); + } + + // Setup a scratch batch that will be used to play back big table rows that were spilled + // to disk for the Hybrid Grace hash partitioning. + spillReplayBatch = VectorizedBatchUtil.makeLike(batch); + + // TEMPORARY -- Set this up for Hybrid Grace logic in MapJoinOperator.closeOp + hashMapRowGetters = new ReusableGetAdaptor[mapJoinTables.length]; + smallTable = posSingleVectorMapJoinSmallTable; + } + + protected void displayBatchColumns(VectorizedRowBatch batch, String batchName) { + LOG.debug("commonSetup " + batchName + " column count " + batch.numCols); + for (int column = 0; column < batch.numCols; column++) { + LOG.debug("commonSetup " + batchName + " column " + column + " type " + (batch.cols[column] == null ? "NULL" : batch.cols[column].getClass().getSimpleName())); + } + } + + @Override + public OperatorType getType() { + return OperatorType.MAPJOIN; + } + + @Override + public VectorizationContext getOuputVectorizationContext() { + return vOutContext; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinGenerateResultOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinGenerateResultOperator.java new file mode 100644 index 0000000..2164be4 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinGenerateResultOperator.java @@ -0,0 +1,859 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.persistence.HybridHashTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.HybridHashTableContainer.HashPartition; +import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorDeserializeRow; +import org.apache.hadoop.hive.ql.exec.vector.VectorSerializeRow; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedBatchUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.optimized.VectorMapJoinOptimizedCreateHashTable; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.hive.serde2.WriteBuffers.ByteSegmentRef; +import org.apache.hadoop.hive.serde2.lazybinary.fast.LazyBinaryDeserializeRead; +import org.apache.hadoop.hive.serde2.lazybinary.fast.LazyBinarySerializeWrite; +import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; +import org.apache.hadoop.hive.serde2.ByteStream.Output; + +/** + * This class has methods for generating vectorized join results and forwarding batchs. + * + * In some cases when can forward the big table batch by setting scratch columns + * with small table results and then making use of our output projection to pick out all the + * output result columns. This can improve performance by avoiding copying big table values. + * So, we will use the big table batch's selected in use to represent those rows. + * + * At the same time, some output results need to be formed in the overflow batch. + * For example, to form N x M cross product output results. In this case, we will copy big + * table values into the overflow batch and set scratch columns in it for small table results. + * The "schema" of the overflow batch is the same as the big table batch so child operators + * only need one definition of their input batch. The overflow batch will be typically be + * forwarded when it gets full, which might not be during a process call. + * + * NOTE: Child operators should not remember a received batch. + */ + +public abstract class VectorMapJoinGenerateResultOperator extends VectorMapJoinCommonOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinGenerateResultOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinGenerateResultOperator.class.getName(); + + private transient PrimitiveTypeInfo[] bigTablePrimitiveTypeInfos; + + private transient VectorSerializeRow bigTableVectorSerializeRow; + + private transient VectorDeserializeRow bigTableVectorDeserializeRow; + + // Debug display. + protected transient long batchCounter; + + public VectorMapJoinGenerateResultOperator() { + super(); + } + + public VectorMapJoinGenerateResultOperator(VectorizationContext vContext, OperatorDesc conf) + throws HiveException { + super(vContext, conf); + } + + protected void commonSetup(VectorizedRowBatch batch) throws HiveException { + super.commonSetup(batch); + + batchCounter = 0; + + } + + //------------------------------------------------------------------------------------------------ + + protected void performValueExpressions(VectorizedRowBatch batch, + int[] allMatchs, int allMatchCount) { + /* + * For the moment, pretend all matched are selected so we can evaluate the value + * expressions. + * + * Since we may use the overflow batch when generating results, we will assign the + * selected and real batch size later... + */ + int[] saveSelected = batch.selected; + batch.selected = allMatchs; + boolean saveSelectedInUse = batch.selectedInUse; + batch.selectedInUse = true; + batch.size = allMatchCount; + + // Run our value expressions over whole batch. + for(VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + + batch.selected = saveSelected; + batch.selectedInUse = saveSelectedInUse; + } + + //------------------------------------------------------------------------------------------------ + + /* + * Common generate join results from hash maps used by Inner and Outer joins. + */ + + /** + * Generate join results for a single small table value match. + * + * @param batch + * The big table batch. + * @param hashMapResult + * The hash map results for the matching key. + * @param allMatchs + * The selection array for all matches key. + * @param allMatchesIndex + * Index into allMatches of the matching key we are generating for. + * @param duplicateCount + * Number of equal key rows. + * @param numSel + * Current number of rows that are remaining in the big table for forwarding. + * @return + * The new count of selected rows. + */ + protected int generateHashMapResultSingleValue(VectorizedRowBatch batch, + VectorMapJoinHashMapResult hashMapResult, int[] allMatchs, int allMatchesIndex, + int duplicateCount, int numSel) throws HiveException, IOException { + + // Read single value. + + ByteSegmentRef byteSegmentRef = hashMapResult.first(); + + if (!onlyUseOverflowBatch) { + + // Generate result within big table batch itself. + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + if (bigTableVectorCopyOuterKeys != null) { + // Copy within row. + bigTableVectorCopyOuterKeys.copyByReference(batch, batchIndex, batch, batchIndex); + } + + if (smallTableVectorDeserializeRow != null) { + + byte[] bytes = byteSegmentRef.getBytes(); + int offset = (int) byteSegmentRef.getOffset(); + int length = byteSegmentRef.getLength(); + smallTableVectorDeserializeRow.setBytes(bytes, offset, length); + + smallTableVectorDeserializeRow.deserializeByValue(batch, batchIndex); + } + + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, "generateHashMapResultSingleValue big table"); + + // Use the big table row as output. + batch.selected[numSel++] = batchIndex; + } + } else { + + // Generate result in overflow batch. + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, + overflowBatch, overflowBatch.size); + } + + // Reference the keys we just copied above. + if (bigTableVectorCopyOuterKeys != null) { + bigTableVectorCopyOuterKeys.copyByReference(overflowBatch, overflowBatch.size, + overflowBatch, overflowBatch.size); + } + + if (smallTableVectorDeserializeRow != null) { + + byte[] bytes = byteSegmentRef.getBytes(); + int offset = (int) byteSegmentRef.getOffset(); + int length = byteSegmentRef.getLength(); + smallTableVectorDeserializeRow.setBytes(bytes, offset, length); + + smallTableVectorDeserializeRow.deserializeByValue(overflowBatch, overflowBatch.size); + } + + // VectorizedBatchUtil.debugDisplayOneRow(overflowBatch, overflowBatch.size, "generateHashMapResultSingleValue overflow"); + + overflowBatch.size++; + if (overflowBatch.size == overflowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + } + } + return numSel; + } + + /** + * Generate results for a N x M cross product. + * + * @param batch + * The big table batch. + * @param hashMapResult + * The hash map results for the matching key. + * @param allMatchs + * The all match selected array that contains (physical) batch indices. + * @param allMatchesIndex + * The index of the match key. + * @param duplicateCount + * Number of equal key rows. + */ + protected void generateHashMapResultMultiValue(VectorizedRowBatch batch, + VectorMapJoinHashMapResult hashMapResult, int[] allMatchs, int allMatchesIndex, + int duplicateCount) throws HiveException, IOException { + + if (useOverflowRepeatedThreshold && + hashMapResult.isCappedCountAvailable() && + hashMapResult.cappedCount() > overflowRepeatedThreshold) { + + // Large cross product: generate the vector optimization using repeating vectorized + // row batch optimization in the overflow batch. + + generateHashMapResultLargeMultiValue( + batch, hashMapResult, allMatchs, allMatchesIndex, duplicateCount); + return; + } + + // We do the cross product of the N big table equal key row's values against the + // small table matching key which has M value rows into overflow batch. + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + ByteSegmentRef byteSegmentRef = hashMapResult.first(); + while (byteSegmentRef != null) { + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, + overflowBatch, overflowBatch.size); + } + + // Reference the keys we just copied above. + if (bigTableVectorCopyOuterKeys != null) { + bigTableVectorCopyOuterKeys.copyByReference(overflowBatch, overflowBatch.size, + overflowBatch, overflowBatch.size); + } + + if (smallTableVectorDeserializeRow != null) { + + byte[] bytes = byteSegmentRef.getBytes(); + int offset = (int) byteSegmentRef.getOffset(); + int length = byteSegmentRef.getLength(); + smallTableVectorDeserializeRow.setBytes(bytes, offset, length); + + smallTableVectorDeserializeRow.deserializeByValue(overflowBatch, overflowBatch.size); + } + + // VectorizedBatchUtil.debugDisplayOneRow(overflowBatch, overflowBatch.size, "generateHashMapResultMultiValue overflow"); + + overflowBatch.size++; + if (overflowBatch.size == overflowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + byteSegmentRef = hashMapResult.next(); + } + } + } + + /** + * Generate optimized results for a large N x M cross product using repeated vectorized row + * batch optimization. + * + * @param batch + * The big table batch. + * @param hashMapResult + * The hash map results for the matching key. + * @param allMatchs + * The all match selected array that contains (physical) batch indices. + * @param allMatchesIndex + * The index of the match key. + * @param duplicateCount + * Number of equal key rows. + */ + private void generateHashMapResultLargeMultiValue(VectorizedRowBatch batch, + VectorMapJoinHashMapResult hashMapResult, int[] allMatchs, int allMatchesIndex, + int duplicateCount) throws HiveException, IOException { + + // Kick out previous overflow batch results. + if (overflowBatch.size > 0) { + forwardOverflow(); + } + + ByteSegmentRef byteSegmentRef = hashMapResult.first(); + while (true) { + + // Fill up as much of the overflow batch as possible with small table values. + while (byteSegmentRef != null) { + + if (smallTableVectorDeserializeRow != null) { + + byte[] bytes = byteSegmentRef.getBytes(); + int offset = (int) byteSegmentRef.getOffset(); + int length = byteSegmentRef.getLength(); + smallTableVectorDeserializeRow.setBytes(bytes, offset, length); + + smallTableVectorDeserializeRow.deserializeByValue(overflowBatch, overflowBatch.DEFAULT_SIZE); + } + + overflowBatch.size++; + if (overflowBatch.size == overflowBatch.DEFAULT_SIZE) { + break; + } + byteSegmentRef = hashMapResult.next(); + } + + // Forward the overflow batch over and over: + // + // Reference a new one big table row's values each time + // cross product + // Current "batch" of small table values. + // + // TODO: This could be further optimized to copy big table (equal) keys once + // and only copy big table values each time... + // And, not set repeating every time... + // + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + if (bigTableRetainedVectorCopy != null) { + // The one big table row's values repeat. + bigTableRetainedVectorCopy.copyByReference(batch, batchIndex, overflowBatch, 0); + for (int column : bigTableRetainedMapping.getOutputColumns()) { + overflowBatch.cols[column].isRepeating = true; + } + } + if (bigTableVectorCopyOuterKeys != null) { + bigTableVectorCopyOuterKeys.copyByReference(batch, batchIndex, overflowBatch, 0); + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + overflowBatch.cols[column].isRepeating = true; + } + } + + // Crucial here that we don't reset the overflow batch, or we will loose the small table + // values we put in above. + forwardOverflowNoReset(); + + // Hand reset the big table columns. + for (int column : bigTableRetainedMapping.getOutputColumns()) { + ColumnVector colVector = overflowBatch.cols[column]; + colVector.reset(); + } + + if (bigTableVectorCopyOuterKeys != null) { + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + ColumnVector colVector = overflowBatch.cols[column]; + colVector.reset(); + } + } + } + + if (hashMapResult.isEof()) { + break; + } + byteSegmentRef = hashMapResult.next(); + + // Get ready for a another round of small table values. + overflowBatch.reset(); + } + // Clear away any residue from our optimizations. + overflowBatch.reset(); + } + + /** + * Generate optimized results when entire batch key is repeated and it matched the hash map. + * + * @param batch + * The big table batch. + * @param hashMapResult + * The hash map results for the repeated key. + * @return + * The new count of selected rows. + */ + protected int generateHashMapResultRepeatedAll(VectorizedRowBatch batch, + VectorMapJoinHashMapResult hashMapResult) throws IOException, HiveException { + + int[] selected = batch.selected; + + if (batch.selectedInUse) { + // The selected array is already filled in as we want it. + } else { + for (int i = 0; i < batch.size; i++) { + selected[i] = i; + } + batch.selectedInUse = true; + } + + int numSel = 0; + if (hashMapResult.isSingleRow()) { + numSel = generateHashMapResultSingleValue(batch, hashMapResult, + batch.selected, 0, batch.size, numSel); + + } else { + generateHashMapResultMultiValue(batch, hashMapResult, + batch.selected, 0, batch.size); + } + + return numSel; + } + + //----------------------------------------------------------------------------------------------- + + /* + * Spill. + */ + + + private void setupSpillSerDe(VectorizedRowBatch batch) throws HiveException { + + PrimitiveTypeInfo[] inputObjInspectorsTypeInfos = + VectorizedBatchUtil.primitiveTypeInfosFromStructObjectInspector( + (StructObjectInspector) inputObjInspectors[posBigTable]); + + List projectedColumns = vContext.getProjectedColumns(); + int projectionSize = vContext.getProjectedColumns().size(); + + List typeInfoList = new ArrayList(); + List noNullsProjectionList = new ArrayList(); + for (int i = 0; i < projectionSize; i++) { + int projectedColumn = projectedColumns.get(i); + if (batch.cols[projectedColumn] != null) { + typeInfoList.add(inputObjInspectorsTypeInfos[i]); + noNullsProjectionList.add(projectedColumn); + } + } + + int[] noNullsProjection = ArrayUtils.toPrimitive(noNullsProjectionList.toArray(new Integer[0])); + int noNullsProjectionSize = noNullsProjection.length; + bigTablePrimitiveTypeInfos = typeInfoList.toArray(new PrimitiveTypeInfo[0]); + + bigTableVectorSerializeRow = + new VectorSerializeRow(new LazyBinarySerializeWrite(noNullsProjectionSize)); + + bigTableVectorSerializeRow.init( + bigTablePrimitiveTypeInfos, + noNullsProjectionList); + + bigTableVectorDeserializeRow = new VectorDeserializeRow( + new LazyBinaryDeserializeRead(bigTablePrimitiveTypeInfos)); + + bigTableVectorDeserializeRow.init(noNullsProjection); + } + + private void spillSerializeRow(VectorizedRowBatch batch, int batchIndex, + VectorMapJoinHashTableResult hashTableResult) throws IOException { + + int partitionId = hashTableResult.spillPartitionId(); + + HybridHashTableContainer ht = (HybridHashTableContainer) mapJoinTables[smallTable]; + HashPartition hp = ht.getHashPartitions()[partitionId]; + + VectorMapJoinRowBytesContainer rowBytesContainer = hp.getMatchfileRowBytesContainer(); + Output output = rowBytesContainer.getOuputForRowBytes(); +// int offset = output.getLength(); + bigTableVectorSerializeRow.setOutputAppend(output); + bigTableVectorSerializeRow.serializeWrite(batch, batchIndex); +// int length = output.getLength() - offset; + rowBytesContainer.finishRow(); + +// LOG.info("spillSerializeRow spilled batchIndex " + batchIndex + ", length " + length); + } + + protected void spillHashMapBatch(VectorizedRowBatch batch, + VectorMapJoinHashTableResult[] hashTableResults, + int[] spills, int[] spillHashTableResultIndices, int spillCount) + throws HiveException, IOException { + + if (bigTableVectorSerializeRow == null) { + setupSpillSerDe(batch); + } + + for (int i = 0; i < spillCount; i++) { + int batchIndex = spills[i]; + + int hashTableResultIndex = spillHashTableResultIndices[i]; + VectorMapJoinHashTableResult hashTableResult = hashTableResults[hashTableResultIndex]; + + spillSerializeRow(batch, batchIndex, hashTableResult); + } + } + + protected void spillBatchRepeated(VectorizedRowBatch batch, + VectorMapJoinHashTableResult hashTableResult) throws HiveException, IOException { + + if (bigTableVectorSerializeRow == null) { + setupSpillSerDe(batch); + } + + int[] selected = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + for (int logical = 0; logical < batch.size; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + spillSerializeRow(batch, batchIndex, hashTableResult); + } + } + + @Override + protected void reloadHashTable(HashPartition partition, + HybridHashTableContainer hybridHtContainer) + throws IOException, ClassNotFoundException, HiveException, SerDeException { + + // The super method will reload a hash table partition and + // put a single MapJoinBytesTableContainer into the currentSmallTable member. + super.reloadHashTable(partition, hybridHtContainer); + + vectorMapJoinHashTable = VectorMapJoinOptimizedCreateHashTable.createHashTable(conf, + currentSmallTable); + needHashTableSetup = true; + + LOG.info(CLASS_NAME + " reloadHashTable!"); + } + + @Override + protected void reProcessBigTable(HybridHashTableContainer.HashPartition partition) + throws HiveException, IOException { + + LOG.info(CLASS_NAME + " reProcessBigTable enter..."); + + int rowCount = 0; + int batchCount = 0; + + try { + VectorMapJoinRowBytesContainer bigTable = partition.getMatchfileRowBytesContainer(); + bigTable.prepareForReading(); + + while (bigTable.readNext()) { + rowCount++; + + byte[] bytes = bigTable.currentBytes(); + int offset = bigTable.currentOffset(); + int length = bigTable.currentLength(); + +// LOG.info(CLASS_NAME + " reProcessBigTable serialized row #" + rowCount + ", offset " + offset + ", length " + length); + + bigTableVectorDeserializeRow.setBytes(bytes, offset, length); + bigTableVectorDeserializeRow.deserializeByValue(spillReplayBatch, spillReplayBatch.size); + spillReplayBatch.size++; + + if (spillReplayBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { + LOG.info("reProcessBigTable going to call process with spillReplayBatch.size " + spillReplayBatch.size + " rows"); + process(spillReplayBatch, posBigTable); // call process once we have a full batch + spillReplayBatch.reset(); + batchCount++; + } + } + // Process the row batch that has less than DEFAULT_SIZE rows + if (spillReplayBatch.size > 0) { + LOG.info("reProcessBigTable going to call process with spillReplayBatch.size " + spillReplayBatch.size + " rows"); + process(spillReplayBatch, posBigTable); + spillReplayBatch.reset(); + batchCount++; + } + bigTable.clear(); + } catch (Exception e) { + LOG.info(CLASS_NAME + " reProcessBigTable exception! " + e); + throw new HiveException(e); + } + + LOG.info(CLASS_NAME + " reProcessBigTable exit! " + rowCount + " row processed and " + batchCount + " batches processed"); + } + + + //----------------------------------------------------------------------------------------------- + + /* + * Forwarding. + */ + + /** + * Forward the big table batch to the children. + * + * @param batch + * The big table batch. + */ + public void forwardBigTableBatch(VectorizedRowBatch batch) throws HiveException { + + // Save original projection. + int[] originalProjections = batch.projectedColumns; + int originalProjectionSize = batch.projectionSize; + + // Project with the output of our operator. + batch.projectionSize = outputProjection.length; + batch.projectedColumns = outputProjection; + + forward(batch, null); + + // Revert the projected columns back, because batch can be re-used by our parent operators. + batch.projectionSize = originalProjectionSize; + batch.projectedColumns = originalProjections; + } + + + /** + * Forward the overflow batch and reset the batch. + */ + protected void forwardOverflow() throws HiveException { + forward(overflowBatch, null); + overflowBatch.reset(); + } + + /** + * Forward the overflow batch, but do not reset the batch. + */ + private void forwardOverflowNoReset() throws HiveException { + forward(overflowBatch, null); + } + + /* + * Close. + */ + + /** + * On close, make sure a partially filled overflow batch gets forwarded. + */ + @Override + public void closeOp(boolean aborted) throws HiveException { + super.closeOp(aborted); + if (!aborted && overflowBatch.size > 0) { + forwardOverflow(); + } + LOG.info("VectorMapJoinInnerLongOperator closeOp " + batchCounter + " batches processed"); + } + + //----------------------------------------------------------------------------------------------- + + /* + * Debug. + */ + + public static String intArrayToRangesString(int selection[], int size) { + if (size == 0) { + return "[]"; + } + + StringBuilder sb = new StringBuilder(); + + // Use ranges and duplicate multipliers to reduce the size of the display. + sb.append("["); + int firstIndex = 0; + int firstValue = selection[0]; + + boolean duplicates = false; + + int i = 1; + for ( ; i < size; i++) { + int newValue = selection[i]; + if (newValue == selection[i - 1]) { + + // Duplicate. + duplicates = true; + + if (newValue == firstValue) { + continue; + } else { + // Prior none, singleton, or range? + int priorRangeLength = i - 1 - firstIndex; + + if (priorRangeLength == 0) { + continue; + } + if (firstIndex > 0) { + sb.append(","); + } + sb.append(firstValue); + if (priorRangeLength > 1) { + sb.append(".." + selection[i - 2]); + } + firstIndex = i - 1; + firstValue = newValue; + continue; + } + } else { + if (duplicates) { + int numDuplicates = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(numDuplicates + "*" + firstValue); + duplicates = false; + firstIndex = i; + firstValue = newValue; + continue; + } if (newValue == selection[i - 1] + 1) { + // Continue range.. + continue; + } else { + // Prior singleton or range? + int priorRangeLength = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(firstValue); + if (priorRangeLength > 1) { + sb.append(".." + selection[i - 1]); + } + firstIndex = i; + firstValue = newValue; + continue; + } + } + } + if (duplicates) { + int numDuplicates = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(numDuplicates + "*" + firstValue); + } else { + // Last singleton or range? + int priorRangeLength = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(firstValue); + if (priorRangeLength > 1) { + sb.append(".." + selection[i - 1]); + } + } + sb.append("]"); + return sb.toString(); + } + + public static String longArrayToRangesString(long selection[], int size) { + if (size == 0) { + return "[]"; + } + + StringBuilder sb = new StringBuilder(); + + // Use ranges and duplicate multipliers to reduce the size of the display. + sb.append("["); + int firstIndex = 0; + long firstValue = selection[0]; + + boolean duplicates = false; + + int i = 1; + for ( ; i < size; i++) { + long newValue = selection[i]; + if (newValue == selection[i - 1]) { + + // Duplicate. + duplicates = true; + + if (newValue == firstValue) { + continue; + } else { + // Prior none, singleton, or range? + int priorRangeLength = i - 1 - firstIndex; + + if (priorRangeLength == 0) { + continue; + } + if (firstIndex > 0) { + sb.append(","); + } + sb.append(firstValue); + if (priorRangeLength > 1) { + sb.append(".." + selection[i - 2]); + } + firstIndex = i - 1; + firstValue = newValue; + continue; + } + } else { + if (duplicates) { + int numDuplicates = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(numDuplicates + "*" + firstValue); + duplicates = false; + firstIndex = i; + firstValue = newValue; + continue; + } if (newValue == selection[i - 1] + 1) { + // Continue range.. + continue; + } else { + // Prior singleton or range? + int priorRangeLength = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(firstValue); + if (priorRangeLength > 1) { + sb.append(".." + selection[i - 1]); + } + firstIndex = i; + firstValue = newValue; + continue; + } + } + } + if (duplicates) { + int numDuplicates = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(numDuplicates + "*" + firstValue); + } else { + // Last singleton or range? + int priorRangeLength = i - firstIndex; + if (firstIndex > 0) { + sb.append(","); + } + sb.append(firstValue); + if (priorRangeLength > 1) { + sb.append(".." + selection[i - 1]); + } + } + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyGenerateResultOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyGenerateResultOperator.java new file mode 100644 index 0000000..0640678 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyGenerateResultOperator.java @@ -0,0 +1,370 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +/** + * This class has methods for generating vectorized join results for the big table only + * variation of inner joins. + * + * When an inner join does not have any small table columns in the join result, we use this + * variation we call inner big only. This variation uses a hash multi-set instead of hash map + * since there are no values (just a count). + * + * Note that if a inner key appears in the small table results area, we use the inner join + * projection optimization and are able to use this variation. + */ +public abstract class VectorMapJoinInnerBigOnlyGenerateResultOperator + extends VectorMapJoinGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyGenerateResultOperator.class.getName()); + + //--------------------------------------------------------------------------- + // Inner big-table only join specific members. + // + + // An array of hash multi-set results so we can do lookups on the whole batch before output result + // generation. + protected transient VectorMapJoinHashMultiSetResult hashMultiSetResults[]; + + // Pre-allocated member for storing the (physical) batch index of matching row (single- or + // multi-small-table-valued) indexes during a process call. + protected transient int[] allMatchs; + + /* + * Pre-allocated members for storing information on single- and multi-valued-small-table matches. + * + * ~ValueCounts + * Number of (empty) small table values. + * ~AllMatchIndices + * (Logical) indices into allMatchs to the first row of a match of a + * possible series of duplicate keys. + * ~DuplicateCounts + * The duplicate count for each matched key. + * + */ + protected transient long[] equalKeySeriesValueCounts; + protected transient int[] equalKeySeriesAllMatchIndices; + protected transient int[] equalKeySeriesDuplicateCounts; + + + // Pre-allocated member for storing the (physical) batch index of rows that need to be spilled. + protected transient int[] spills; + + // Pre-allocated member for storing index into the hashMultiSetResults for each spilled row. + protected transient int[] spillHashMapResultIndices; + + public VectorMapJoinInnerBigOnlyGenerateResultOperator() { + super(); + } + + public VectorMapJoinInnerBigOnlyGenerateResultOperator(VectorizationContext vContext, OperatorDesc conf) + throws HiveException { + super(vContext, conf); + } + + /* + * Setup our inner big table only join specific members. + */ + protected void commonSetup(VectorizedRowBatch batch) throws HiveException { + super.commonSetup(batch); + + // Inner big-table only join specific. + VectorMapJoinHashMultiSet baseHashMultiSet = (VectorMapJoinHashMultiSet) vectorMapJoinHashTable; + + hashMultiSetResults = new VectorMapJoinHashMultiSetResult[batch.DEFAULT_SIZE]; + for (int i = 0; i < hashMultiSetResults.length; i++) { + hashMultiSetResults[i] = baseHashMultiSet.createHashMultiSetResult(); + } + + allMatchs = new int[batch.DEFAULT_SIZE]; + + equalKeySeriesValueCounts = new long[batch.DEFAULT_SIZE]; + equalKeySeriesAllMatchIndices = new int[batch.DEFAULT_SIZE]; + equalKeySeriesDuplicateCounts = new int[batch.DEFAULT_SIZE]; + + spills = new int[batch.DEFAULT_SIZE]; + spillHashMapResultIndices = new int[batch.DEFAULT_SIZE]; + } + + //----------------------------------------------------------------------------------------------- + + /* + * Inner big table only join (hash multi-set). + */ + + /** + * Generate the inner big table only join output results for one vectorized row batch. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param allMatchs + * A subset of the rows of the batch that are matches. + * @param allMatchCount + * Number of matches in allMatchs. + * @param equalKeySeriesValueCounts + * For each equal key series, whether the number of (empty) small table values. + * @param equalKeySeriesAllMatchIndices + * For each equal key series, the logical index into allMatchs. + * @param equalKeySeriesDuplicateCounts + * For each equal key series, the number of duplicates or equal keys. + * @param equalKeySeriesCount + * Number of single value matches. + * @param spills + * A subset of the rows of the batch that are spills. + * @param spillHashMapResultIndices + * For each entry in spills, the index into the hashMapResult. + * @param spillCount + * Number of spills in spills. + * @param hashTableResults + * The array of all hash table results for the batch. We need the + * VectorMapJoinHashTableResult for the spill information. + * @param hashMapResultCount + * Number of entries in hashMapResults. + * + **/ + protected int finishInnerBigOnly(VectorizedRowBatch batch, + int[] allMatchs, int allMatchCount, + long[] equalKeySeriesValueCounts, int[] equalKeySeriesAllMatchIndices, + int[] equalKeySeriesDuplicateCounts, int equalKeySeriesCount, + int[] spills, int[] spillHashMapResultIndices, int spillCount, + VectorMapJoinHashTableResult[] hashTableResults, int hashMapResultCount) + throws HiveException, IOException { + + int numSel = 0; + + /* + * Optimize by running value expressions only over the matched rows. + */ + if (allMatchCount > 0 && bigTableValueExpressions != null) { + performValueExpressions(batch, allMatchs, allMatchCount); + } + + for (int i = 0; i < equalKeySeriesCount; i++) { + long count = equalKeySeriesValueCounts[i]; + int allMatchesIndex = equalKeySeriesAllMatchIndices[i]; + int duplicateCount = equalKeySeriesDuplicateCounts[i]; + + if (count == 1) { + numSel = generateHashMultiSetResultSingleValue( + batch, allMatchs, allMatchesIndex, duplicateCount, numSel); + } else { + generateHashMultiSetResultMultiValue(batch, + allMatchs, allMatchesIndex, + duplicateCount, count); + } + } + + if (spillCount > 0) { + spillHashMapBatch(batch, hashTableResults, + spills, spillHashMapResultIndices, spillCount); + } + + return numSel; + } + + /** + * Generate the single value match inner big table only join output results for a match. + * + * @param batch + * The big table batch. + * @param allMatchs + * A subset of the rows of the batch that are matches. + * @param allMatchesIndex + * The logical index into allMatchs of the first equal key. + * @param duplicateCount + * The number of duplicates or equal keys. + * @param numSel + * The current count of rows in the rebuilding of the selected array. + * + * @return + * The new count of selected rows. + */ + private int generateHashMultiSetResultSingleValue(VectorizedRowBatch batch, + int[] allMatchs, int allMatchesIndex, int duplicateCount, int numSel) + throws HiveException, IOException { + + // LOG.info("generateHashMultiSetResultSingleValue enter..."); + + if (!onlyUseOverflowBatch) { + + // Generate result within big table batch itself. + + // LOG.info("generateHashMultiSetResultSingleValue with big table..."); + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + // Use the big table row as output. + batch.selected[numSel++] = batchIndex; + } + } else { + + // Generate result in overflow batch. + + // LOG.info("generateHashMultiSetResultSingleValue in overflow batch.. (bigTableRetainedVectorCopy != null)" + (bigTableRetainedVectorCopy != null)); + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, + overflowBatch, overflowBatch.size); + } + + overflowBatch.size++; + if (overflowBatch.size == overflowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + } + } + return numSel; + } + + /** + * Generate results for a N x M cross product. + * + * @param batch + * The big table batch. + * @param allMatchs + * The all match selected array that contains (physical) batch indices. + * @param allMatchesIndex + * The index of the match key. + * @param duplicateCount + * Number of equal key rows. + * @param count + * Value count. + */ + private void generateHashMultiSetResultMultiValue(VectorizedRowBatch batch, + int[] allMatchs, int allMatchesIndex, + int duplicateCount, long count) throws HiveException, IOException { + + // LOG.info("generateHashMultiSetResultMultiValue allMatchesIndex " + allMatchesIndex + " duplicateCount " + duplicateCount + " count " + count); + + // TODO: Look at repeating optimizations... + + for (int i = 0; i < duplicateCount; i++) { + + int batchIndex = allMatchs[allMatchesIndex + i]; + + for (long l = 0; l < count; l++) { + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, + overflowBatch, overflowBatch.size); + } + + overflowBatch.size++; + if (overflowBatch.size == overflowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + } + } + } + + /** + * Generate the inner big table only join output results for one vectorized row batch with + * a repeated key. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param hashMultiSetResult + * The hash multi-set results for the batch. + */ + protected int generateHashMultiSetResultRepeatedAll(VectorizedRowBatch batch, + VectorMapJoinHashMultiSetResult hashMultiSetResult) throws HiveException { + + long count = hashMultiSetResult.count(); + + if (batch.selectedInUse) { + // The selected array is already filled in as we want it. + } else { + int[] selected = batch.selected; + for (int i = 0; i < batch.size; i++) { + selected[i] = i; + } + batch.selectedInUse = true; + } + + while (true) { + forwardBigTableBatch(batch); + count--; + if (count == 0) { + break; + } + } + + // We forwarded the batch in this method. + return 0; + } + + protected int finishInnerBigOnlyRepeated(VectorizedRowBatch batch, JoinUtil.JoinResult joinResult, + VectorMapJoinHashMultiSetResult hashMultiSetResult) throws HiveException, IOException { + + int numSel = 0; + + switch (joinResult) { + case MATCH: + + if (bigTableValueExpressions != null) { + // Run our value expressions over whole batch. + for(VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + } + + // Generate special repeated case. + numSel = generateHashMultiSetResultRepeatedAll(batch, hashMultiSetResult); + break; + + case SPILL: + // Whole batch is spilled. + spillBatchRepeated(batch, (VectorMapJoinHashTableResult) hashMultiSetResult); + break; + + case NOMATCH: + // No match for entire batch. + break; + } + + return numSel; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyLongOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyLongOperator.java new file mode 100644 index 0000000..2173829 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyLongOperator.java @@ -0,0 +1,378 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column Long hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMultiSet; + +// Single-Column Long specific imports. +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; + +/* + * Specialized class for doing a vectorized map join that is an inner join on a Single-Column Long + * and only big table columns appear in the join result so a hash multi-set is used. + */ +public class VectorMapJoinInnerBigOnlyLongOperator extends VectorMapJoinInnerBigOnlyGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyLongOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinInnerBigOnlyLongOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinLongHashMultiSet hashMultiSet; + + //--------------------------------------------------------------------------- + // Single-Column Long specific members. + // + + // For integers, we have optional min/max filtering. + private transient boolean useMinMax; + private transient long min; + private transient long max; + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinInnerBigOnlyLongOperator() { + super(); + } + + public VectorMapJoinInnerBigOnlyLongOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column Long Inner Big-Only Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column Long members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column Long hash multi-set information for this specialized class. + */ + + hashMultiSet = (VectorMapJoinLongHashMultiSet) vectorMapJoinHashTable; + useMinMax = hashMultiSet.useMinMax(); + if (useMinMax) { + min = hashMultiSet.min(); + max = hashMultiSet.max(); + } + + needHashTableSetup = false; + } + + batchCounter++; + + // For inner joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column Long specific declarations. + */ + + // The one join column for this specialized class. + LongColumnVector joinColVector = (LongColumnVector) batch.cols[singleJoinColumn]; + long[] vector = joinColVector.vector; + + /* + * Single-Column Long check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column Long specific repeated lookup. + */ + + long key = vector[0]; + JoinUtil.JoinResult joinResult; + if (useMinMax && (key < min || key > max)) { + // Out of range for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + joinResult = hashMultiSet.contains(key, hashMultiSetResults[0]); + } + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishInnerBigOnlyRepeated(batch, joinResult, hashMultiSetResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashMultiSetResultCount = 0; + int allMatchCount = 0; + int equalKeySeriesCount = 0; + int spillCount = 0; + + /* + * Single-Column Long specific variables. + */ + + long saveKey = 0; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column Long get key. + */ + + long currentKey = vector[batchIndex]; + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || currentKey != saveKey) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + // We have extracted the count from the hash multi-set result, so we don't keep it. + equalKeySeriesCount++; + break; + case SPILL: + // We keep the hash multi-set result for its spill information. + hashMultiSetResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column Long specific save key. + */ + + saveKey = currentKey; + + /* + * Single-Column Long specific lookup key. + */ + + if (useMinMax && (currentKey < min || currentKey > max)) { + // Key out of range for whole hash table. + saveJoinResult = JoinUtil.JoinResult.NOMATCH; + } else { + saveJoinResult = hashMultiSet.contains(currentKey, hashMultiSetResults[hashMultiSetResultCount]); + } + + /* + * Common inner big-only join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesValueCounts[equalKeySeriesCount] = hashMultiSetResults[hashMultiSetResultCount].count(); + equalKeySeriesAllMatchIndices[equalKeySeriesCount] = allMatchCount; + equalKeySeriesDuplicateCounts[equalKeySeriesCount] = 1; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMultiSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesDuplicateCounts[equalKeySeriesCount]++; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMultiSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + // We have extracted the count from the hash multi-set result, so we don't keep it. + equalKeySeriesCount++; + break; + case SPILL: + // We keep the hash multi-set result for its spill information. + hashMultiSetResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs, allMatchCount) + + " equalKeySeriesValueCounts " + longArrayToRangesString(equalKeySeriesValueCounts, equalKeySeriesCount) + + " equalKeySeriesAllMatchIndices " + intArrayToRangesString(equalKeySeriesAllMatchIndices, equalKeySeriesCount) + + " equalKeySeriesDuplicateCounts " + intArrayToRangesString(equalKeySeriesDuplicateCounts, equalKeySeriesCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMultiSetResults, 0, hashMultiSetResultCount))); + } + + numSel = finishInnerBigOnly(batch, + allMatchs, allMatchCount, + equalKeySeriesValueCounts, equalKeySeriesAllMatchIndices, + equalKeySeriesDuplicateCounts, equalKeySeriesCount, + spills, spillHashMapResultIndices, spillCount, + (VectorMapJoinHashTableResult[]) hashMultiSetResults, hashMultiSetResultCount); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyMultiKeyOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyMultiKeyOperator.java new file mode 100644 index 0000000..ab6c17e --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyMultiKeyOperator.java @@ -0,0 +1,391 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Multi-Key hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMultiSet; + +// Multi-Key specific imports. +import org.apache.hadoop.hive.ql.exec.vector.VectorSerializeRowNoNulls; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableSerializeWrite; + +/* + * Specialized class for doing a vectorized map join that is an inner join on Multi-Key + * and only big table columns appear in the join result so a hash multi-set is used. + */ + +public class VectorMapJoinInnerBigOnlyMultiKeyOperator extends VectorMapJoinInnerBigOnlyGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyMultiKeyOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinInnerBigOnlyMultiKeyOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashMultiSet hashMultiSet; + + //--------------------------------------------------------------------------- + // Multi-Key specific members. + // + + // Object that can take a set of columns in row in a vectorized row batch and serialized it. + // Known to not have any nulls. + private transient VectorSerializeRowNoNulls keyVectorSerializeWriteNoNulls; + + // The BinarySortable serialization of the current key. + private transient Output currentKeyOutput; + + // The BinarySortable serialization of the saved key for a possible series of equal keys. + private transient Output saveKeyOutput; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinInnerBigOnlyMultiKeyOperator() { + super(); + } + + public VectorMapJoinInnerBigOnlyMultiKeyOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Multi-Key Inner Big-Only Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Multi-Key members for this specialized class. + */ + + keyVectorSerializeWriteNoNulls = new VectorSerializeRowNoNulls( + new BinarySortableSerializeWrite(bigTableKeyColumnMap.length)); + keyVectorSerializeWriteNoNulls.init(bigTableKeyTypeNames, bigTableKeyColumnMap); + + currentKeyOutput = new Output(); + saveKeyOutput = new Output(); + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Multi-Key hash multi-set information for this specialized class. + */ + + hashMultiSet = (VectorMapJoinBytesHashMultiSet) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For inner joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Multi-Key specific declarations. + */ + + // None. + + /* + * Multi-Key check for repeating. + */ + + // If all BigTable input columns to key expressions are isRepeating, then + // calculate key once; lookup once. + boolean allKeyInputColumnsRepeating; + if (bigTableKeyColumnMap.length == 0) { + allKeyInputColumnsRepeating = false; + } else { + allKeyInputColumnsRepeating = true; + for (int i = 0; i < bigTableKeyColumnMap.length; i++) { + if (!batch.cols[bigTableKeyColumnMap[i]].isRepeating) { + allKeyInputColumnsRepeating = false; + break; + } + } + } + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Multi-Key specific repeated lookup. + */ + + keyVectorSerializeWriteNoNulls.setOutput(currentKeyOutput); + keyVectorSerializeWriteNoNulls.serializeWriteNoNulls(batch, 0); + byte[] keyBytes = currentKeyOutput.getData(); + int keyLength = currentKeyOutput.getLength(); + JoinUtil.JoinResult joinResult = hashMultiSet.contains(keyBytes, 0, keyLength, hashMultiSetResults[0]); + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishInnerBigOnlyRepeated(batch, joinResult, hashMultiSetResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashMultiSetResultCount = 0; + int allMatchCount = 0; + int equalKeySeriesCount = 0; + int spillCount = 0; + + /* + * Multi-Key specific variables. + */ + + Output temp; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Multi-Key get key. + */ + + // Generate binary sortable key for current row in vectorized row batch. + keyVectorSerializeWriteNoNulls.setOutput(currentKeyOutput); + keyVectorSerializeWriteNoNulls.serializeWriteNoNulls(batch, batchIndex); + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || !saveKeyOutput.arraysEquals(currentKeyOutput)) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + // We have extracted the count from the hash multi-set result, so we don't keep it. + equalKeySeriesCount++; + break; + case SPILL: + // We keep the hash multi-set result for its spill information. + hashMultiSetResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Multi-Key specific save key. + */ + + temp = saveKeyOutput; + saveKeyOutput = currentKeyOutput; + currentKeyOutput = temp; + + /* + * Single-Column Long specific lookup key. + */ + + byte[] keyBytes = saveKeyOutput.getData(); + int keyLength = saveKeyOutput.getLength(); + saveJoinResult = hashMultiSet.contains(keyBytes, 0, keyLength, hashMultiSetResults[hashMultiSetResultCount]); + + /* + * Common inner big-only join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesValueCounts[equalKeySeriesCount] = hashMultiSetResults[hashMultiSetResultCount].count(); + equalKeySeriesAllMatchIndices[equalKeySeriesCount] = allMatchCount; + equalKeySeriesDuplicateCounts[equalKeySeriesCount] = 1; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMultiSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesDuplicateCounts[equalKeySeriesCount]++; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMultiSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + // We have extracted the count from the hash multi-set result, so we don't keep it. + equalKeySeriesCount++; + break; + case SPILL: + // We keep the hash multi-set result for its spill information. + hashMultiSetResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs, allMatchCount) + + " equalKeySeriesValueCounts " + longArrayToRangesString(equalKeySeriesValueCounts, equalKeySeriesCount) + + " equalKeySeriesAllMatchIndices " + intArrayToRangesString(equalKeySeriesAllMatchIndices, equalKeySeriesCount) + + " equalKeySeriesDuplicateCounts " + intArrayToRangesString(equalKeySeriesDuplicateCounts, equalKeySeriesCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMultiSetResults, 0, hashMultiSetResultCount))); + } + + numSel = finishInnerBigOnly(batch, + allMatchs, allMatchCount, + equalKeySeriesValueCounts, equalKeySeriesAllMatchIndices, + equalKeySeriesDuplicateCounts, equalKeySeriesCount, + spills, spillHashMapResultIndices, spillCount, + (VectorMapJoinHashTableResult[]) hashMultiSetResults, hashMultiSetResultCount); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyStringOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyStringOperator.java new file mode 100644 index 0000000..0b725aa --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerBigOnlyStringOperator.java @@ -0,0 +1,367 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column String hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMultiSet; + +// Single-Column String specific imports. +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; + +/* + * Specialized class for doing a vectorized map join that is an inner join on a Single-Column String + * and only big table columns appear in the join result so a hash multi-set is used. + */ +public class VectorMapJoinInnerBigOnlyStringOperator extends VectorMapJoinInnerBigOnlyGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyStringOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinInnerBigOnlyStringOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashMultiSet hashMultiSet; + + //--------------------------------------------------------------------------- + // Single-Column String specific members. + // + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinInnerBigOnlyStringOperator() { + super(); + } + + public VectorMapJoinInnerBigOnlyStringOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column String Inner Big-Only Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column String members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column String hash multi-set information for this specialized class. + */ + + hashMultiSet = (VectorMapJoinBytesHashMultiSet) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For inner joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column String specific declarations. + */ + + // The one join column for this specialized class. + BytesColumnVector joinColVector = (BytesColumnVector) batch.cols[singleJoinColumn]; + byte[][] vector = joinColVector.vector; + int[] start = joinColVector.start; + int[] length = joinColVector.length; + + /* + * Single-Column String check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column String specific repeated lookup. + */ + + byte[] keyBytes = vector[0]; + int keyStart = start[0]; + int keyLength = length[0]; + JoinUtil.JoinResult joinResult = hashMultiSet.contains(keyBytes, keyStart, keyLength, hashMultiSetResults[0]); + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishInnerBigOnlyRepeated(batch, joinResult, hashMultiSetResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashMultiSetResultCount = 0; + int allMatchCount = 0; + int equalKeySeriesCount = 0; + int spillCount = 0; + + /* + * Single-Column String specific variables. + */ + + int saveKeyBatchIndex = -1; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column String get key. + */ + + // Implicit -- use batchIndex. + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || + StringExpr.compare(vector[saveKeyBatchIndex], start[saveKeyBatchIndex], length[saveKeyBatchIndex], + vector[batchIndex], start[batchIndex], length[batchIndex]) != 0) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + // We have extracted the count from the hash multi-set result, so we don't keep it. + equalKeySeriesCount++; + break; + case SPILL: + // We keep the hash multi-set result for its spill information. + hashMultiSetResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column String specific save key. + */ + + saveKeyBatchIndex = batchIndex; + + /* + * Single-Column String specific lookup key. + */ + + byte[] keyBytes = vector[batchIndex]; + int keyStart = start[batchIndex]; + int keyLength = length[batchIndex]; + saveJoinResult = hashMultiSet.contains(keyBytes, keyStart, keyLength, hashMultiSetResults[hashMultiSetResultCount]); + + /* + * Common inner big-only join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesValueCounts[equalKeySeriesCount] = hashMultiSetResults[hashMultiSetResultCount].count(); + equalKeySeriesAllMatchIndices[equalKeySeriesCount] = allMatchCount; + equalKeySeriesDuplicateCounts[equalKeySeriesCount] = 1; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMultiSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesDuplicateCounts[equalKeySeriesCount]++; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMultiSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + // We have extracted the count from the hash multi-set result, so we don't keep it. + equalKeySeriesCount++; + break; + case SPILL: + // We keep the hash multi-set result for its spill information. + hashMultiSetResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs, allMatchCount) + + " equalKeySeriesValueCounts " + longArrayToRangesString(equalKeySeriesValueCounts, equalKeySeriesCount) + + " equalKeySeriesAllMatchIndices " + intArrayToRangesString(equalKeySeriesAllMatchIndices, equalKeySeriesCount) + + " equalKeySeriesDuplicateCounts " + intArrayToRangesString(equalKeySeriesDuplicateCounts, equalKeySeriesCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMultiSetResults, 0, hashMultiSetResultCount))); + } + + numSel = finishInnerBigOnly(batch, + allMatchs, allMatchCount, + equalKeySeriesValueCounts, equalKeySeriesAllMatchIndices, + equalKeySeriesDuplicateCounts, equalKeySeriesCount, + spills, spillHashMapResultIndices, spillCount, + (VectorMapJoinHashTableResult[]) hashMultiSetResults, hashMultiSetResultCount); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerGenerateResultOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerGenerateResultOperator.java new file mode 100644 index 0000000..a7eb454 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerGenerateResultOperator.java @@ -0,0 +1,236 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +/** + * This class has methods for generating vectorized join results for inner joins. + * + * Inner joins use a hash map to lookup the 1 or more small table values. + * + * One vector inner join optimization is projecting inner keys. When a key appears + * in the small table results area, instead of copying or referencing key we just include + * that key again in the output projection. + * + * Another optimization is when an inner join does not have any small table columns in the + * join result, we use a different variation call inner big only. That variation uses + * a hash multi-set instead of hash map since there are no values (just a count). + */ +public abstract class VectorMapJoinInnerGenerateResultOperator + extends VectorMapJoinGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerGenerateResultOperator.class.getName()); + + //--------------------------------------------------------------------------- + // Inner join specific members. + // + + // An array of hash map results so we can do lookups on the whole batch before output result + // generation. + protected transient VectorMapJoinHashMapResult hashMapResults[]; + + // Pre-allocated member for storing the (physical) batch index of matching row (single- or + // multi-small-table-valued) indexes during a process call. + protected transient int[] allMatchs; + + /* + * Pre-allocated members for storing information equal key series for small-table matches. + * + * ~HashMapResultIndices + * Index into the hashMapResults array for the match. + * ~AllMatchIndices + * (Logical) indices into allMatchs to the first row of a match of a + * possible series of duplicate keys. + * ~IsSingleValue + * Whether there is 1 or multiple small table values. + * ~DuplicateCounts + * The duplicate count for each matched key. + * + */ + protected transient int[] equalKeySeriesHashMapResultIndices; + protected transient int[] equalKeySeriesAllMatchIndices; + protected transient boolean[] equalKeySeriesIsSingleValue; + protected transient int[] equalKeySeriesDuplicateCounts; + + // Pre-allocated member for storing the (physical) batch index of rows that need to be spilled. + protected transient int[] spills; + + // Pre-allocated member for storing index into the hashMapResults for each spilled row. + protected transient int[] spillHashMapResultIndices; + + public VectorMapJoinInnerGenerateResultOperator() { + super(); + } + + public VectorMapJoinInnerGenerateResultOperator(VectorizationContext vContext, OperatorDesc conf) + throws HiveException { + super(vContext, conf); + } + + /* + * Setup our inner join specific members. + */ + protected void commonSetup(VectorizedRowBatch batch) throws HiveException { + super.commonSetup(batch); + + // Inner join specific. + VectorMapJoinHashMap baseHashMap = (VectorMapJoinHashMap) vectorMapJoinHashTable; + + hashMapResults = new VectorMapJoinHashMapResult[batch.DEFAULT_SIZE]; + for (int i = 0; i < hashMapResults.length; i++) { + hashMapResults[i] = baseHashMap.createHashMapResult(); + } + + allMatchs = new int[batch.DEFAULT_SIZE]; + + equalKeySeriesHashMapResultIndices = new int[batch.DEFAULT_SIZE]; + equalKeySeriesAllMatchIndices = new int[batch.DEFAULT_SIZE]; + equalKeySeriesIsSingleValue = new boolean[batch.DEFAULT_SIZE]; + equalKeySeriesDuplicateCounts = new int[batch.DEFAULT_SIZE]; + + spills = new int[batch.DEFAULT_SIZE]; + spillHashMapResultIndices = new int[batch.DEFAULT_SIZE]; + } + + /* + * Inner join (hash map). + */ + + /** + * Generate the inner join output results for one vectorized row batch. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param allMatchs + * A subset of the rows of the batch that are matches. + * @param allMatchCount + * Number of matches in allMatchs. + * @param equalKeySeriesHashMapResultIndices + * For each equal key series, the index into the hashMapResult. + * @param equalKeySeriesAllMatchIndices + * For each equal key series, the logical index into allMatchs. + * @param equalKeySeriesIsSingleValue + * For each equal key series, whether there is 1 or multiple small table values. + * @param equalKeySeriesDuplicateCounts + * For each equal key series, the number of duplicates or equal keys. + * @param equalKeySeriesCount + * Number of single value matches. + * @param spills + * A subset of the rows of the batch that are spills. + * @param spillHashMapResultIndices + * For each entry in spills, the index into the hashMapResult. + * @param spillCount + * Number of spills in spills. + * @param hashMapResults + * The array of all hash map results for the batch. + * @param hashMapResultCount + * Number of entries in hashMapResults. + */ + protected int finishInner(VectorizedRowBatch batch, + int[] allMatchs, int allMatchCount, + int[] equalKeySeriesHashMapResultIndices, int[] equalKeySeriesAllMatchIndices, + boolean[] equalKeySeriesIsSingleValue, int[] equalKeySeriesDuplicateCounts, + int equalKeySeriesCount, + int[] spills, int[] spillHashMapResultIndices, int spillCount, + VectorMapJoinHashMapResult[] hashMapResults, int hashMapResultCount) + throws HiveException, IOException { + + int numSel = 0; + + /* + * Optimize by running value expressions only over the matched rows. + */ + if (allMatchCount > 0 && bigTableValueExpressions != null) { + performValueExpressions(batch, allMatchs, allMatchCount); + } + + for (int i = 0; i < equalKeySeriesCount; i++) { + int hashMapResultIndex = equalKeySeriesHashMapResultIndices[i]; + VectorMapJoinHashMapResult hashMapResult = hashMapResults[hashMapResultIndex]; + int allMatchesIndex = equalKeySeriesAllMatchIndices[i]; + boolean isSingleValue = equalKeySeriesIsSingleValue[i]; + int duplicateCount = equalKeySeriesDuplicateCounts[i]; + + if (isSingleValue) { + numSel = generateHashMapResultSingleValue( + batch, hashMapResult, allMatchs, allMatchesIndex, duplicateCount, numSel); + } else { + generateHashMapResultMultiValue( + batch, hashMapResult, allMatchs, allMatchesIndex, duplicateCount); + } + } + + if (spillCount > 0) { + spillHashMapBatch(batch, (VectorMapJoinHashTableResult[]) hashMapResults, + spills, spillHashMapResultIndices, spillCount); + } + + return numSel; + } + + protected int finishInnerRepeated(VectorizedRowBatch batch, JoinUtil.JoinResult joinResult, + VectorMapJoinHashTableResult hashMapResult) throws HiveException, IOException { + + int numSel = 0; + + switch (joinResult) { + case MATCH: + + if (bigTableValueExpressions != null) { + // Run our value expressions over whole batch. + for(VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + } + + // Generate special repeated case. + numSel = generateHashMapResultRepeatedAll(batch, hashMapResults[0]); + break; + + case SPILL: + // Whole batch is spilled. + spillBatchRepeated(batch, (VectorMapJoinHashTableResult) hashMapResults[0]); + break; + + case NOMATCH: + // No match for entire batch. + break; + } + /* + * Common repeated join result processing. + */ + + return numSel; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerLongOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerLongOperator.java new file mode 100644 index 0000000..c998252 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerLongOperator.java @@ -0,0 +1,378 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column Long hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMap; + +// Single-Column Long specific imports. +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; + +/* + * Specialized class for doing a vectorized map join that is an inner join on a Single-Column Long + * using a hash map. + */ +public class VectorMapJoinInnerLongOperator extends VectorMapJoinInnerGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerLongOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinInnerLongOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinLongHashMap hashMap; + + //--------------------------------------------------------------------------- + // Single-Column Long specific members. + // + + // For integers, we have optional min/max filtering. + private transient boolean useMinMax; + private transient long min; + private transient long max; + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinInnerLongOperator() { + super(); + } + + public VectorMapJoinInnerLongOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column Long Inner Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column Long members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column Long hash map information for this specialized class. + */ + + hashMap = (VectorMapJoinLongHashMap) vectorMapJoinHashTable; + useMinMax = hashMap.useMinMax(); + if (useMinMax) { + min = hashMap.min(); + max = hashMap.max(); + } + + needHashTableSetup = false; + } + + batchCounter++; + + // For inner joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column Long specific declarations. + */ + + // The one join column for this specialized class. + LongColumnVector joinColVector = (LongColumnVector) batch.cols[singleJoinColumn]; + long[] vector = joinColVector.vector; + + /* + * Single-Column Long check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column Long specific repeated lookup. + */ + + long key = vector[0]; + JoinUtil.JoinResult joinResult; + if (useMinMax && (key < min || key > max)) { + // Out of range for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + joinResult = hashMap.lookup(key, hashMapResults[0]); + } + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishInnerRepeated(batch, joinResult, hashMapResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashMapResultCount = 0; + int allMatchCount = 0; + int equalKeySeriesCount = 0; + int spillCount = 0; + + /* + * Single-Column Long specific variables. + */ + + long saveKey = 0; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column Long get key. + */ + + long currentKey = vector[batchIndex]; + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || currentKey != saveKey) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + hashMapResultCount++; + equalKeySeriesCount++; + break; + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column Long specific save key. + */ + + saveKey = currentKey; + + /* + * Single-Column Long specific lookup key. + */ + + if (useMinMax && (currentKey < min || currentKey > max)) { + // Key out of range for whole hash table. + saveJoinResult = JoinUtil.JoinResult.NOMATCH; + } else { + saveJoinResult = hashMap.lookup(currentKey, hashMapResults[hashMapResultCount]); + } + + /* + * Common inner join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesHashMapResultIndices[equalKeySeriesCount] = hashMapResultCount; + equalKeySeriesAllMatchIndices[equalKeySeriesCount] = allMatchCount; + equalKeySeriesIsSingleValue[equalKeySeriesCount] = hashMapResults[hashMapResultCount].isSingleRow(); + equalKeySeriesDuplicateCounts[equalKeySeriesCount] = 1; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesDuplicateCounts[equalKeySeriesCount]++; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + hashMapResultCount++; + equalKeySeriesCount++; + break; + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs,allMatchCount) + + " equalKeySeriesHashMapResultIndices " + intArrayToRangesString(equalKeySeriesHashMapResultIndices, equalKeySeriesCount) + + " equalKeySeriesAllMatchIndices " + intArrayToRangesString(equalKeySeriesAllMatchIndices, equalKeySeriesCount) + + " equalKeySeriesIsSingleValue " + Arrays.toString(Arrays.copyOfRange(equalKeySeriesIsSingleValue, 0, equalKeySeriesCount)) + + " equalKeySeriesDuplicateCounts " + Arrays.toString(Arrays.copyOfRange(equalKeySeriesDuplicateCounts, 0, equalKeySeriesCount)) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMapResults, 0, hashMapResultCount))); + } + + numSel = finishInner(batch, + allMatchs, allMatchCount, + equalKeySeriesHashMapResultIndices, equalKeySeriesAllMatchIndices, + equalKeySeriesIsSingleValue, equalKeySeriesDuplicateCounts, + equalKeySeriesCount, + spills, spillHashMapResultIndices, spillCount, + hashMapResults, hashMapResultCount); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerMultiKeyOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerMultiKeyOperator.java new file mode 100644 index 0000000..e426476 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerMultiKeyOperator.java @@ -0,0 +1,390 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Multi-Key hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; + +// Multi-Key specific imports. +import org.apache.hadoop.hive.ql.exec.vector.VectorSerializeRowNoNulls; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableSerializeWrite; + +/* + * Specialized class for doing a vectorized map join that is an inner join on a Multi-Key + * using a hash map. + */ +public class VectorMapJoinInnerMultiKeyOperator extends VectorMapJoinInnerGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerMultiKeyOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinInnerMultiKeyOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashMap hashMap; + + //--------------------------------------------------------------------------- + // Multi-Key specific members. + // + + // Object that can take a set of columns in row in a vectorized row batch and serialized it. + // Known to not have any nulls. + private transient VectorSerializeRowNoNulls keyVectorSerializeWriteNoNulls; + + // The BinarySortable serialization of the current key. + private transient Output currentKeyOutput; + + // The BinarySortable serialization of the saved key for a possible series of equal keys. + private transient Output saveKeyOutput; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinInnerMultiKeyOperator() { + super(); + } + + public VectorMapJoinInnerMultiKeyOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Multi-Key Inner Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Multi-Key members for this specialized class. + */ + + keyVectorSerializeWriteNoNulls = new VectorSerializeRowNoNulls( + new BinarySortableSerializeWrite(bigTableKeyColumnMap.length)); + keyVectorSerializeWriteNoNulls.init(bigTableKeyTypeNames, bigTableKeyColumnMap); + + currentKeyOutput = new Output(); + saveKeyOutput = new Output(); + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Multi-Key hash map information for this specialized class. + */ + + hashMap = (VectorMapJoinBytesHashMap) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For inner joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Multi-Key specific declarations. + */ + + // None. + + /* + * Multi-Key check for repeating. + */ + + // If all BigTable input columns to key expressions are isRepeating, then + // calculate key once; lookup once. + boolean allKeyInputColumnsRepeating; + if (bigTableKeyColumnMap.length == 0) { + allKeyInputColumnsRepeating = false; + } else { + allKeyInputColumnsRepeating = true; + for (int i = 0; i < bigTableKeyColumnMap.length; i++) { + if (!batch.cols[bigTableKeyColumnMap[i]].isRepeating) { + allKeyInputColumnsRepeating = false; + break; + } + } + } + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Multi-Key specific repeated lookup. + */ + + keyVectorSerializeWriteNoNulls.setOutput(currentKeyOutput); + keyVectorSerializeWriteNoNulls.serializeWriteNoNulls(batch, 0); + byte[] keyBytes = currentKeyOutput.getData(); + int keyLength = currentKeyOutput.getLength(); + JoinUtil.JoinResult joinResult = hashMap.lookup(keyBytes, 0, keyLength, hashMapResults[0]); + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishInnerRepeated(batch, joinResult, hashMapResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashMapResultCount = 0; + int allMatchCount = 0; + int equalKeySeriesCount = 0; + int spillCount = 0; + + /* + * Multi-Key specific variables. + */ + + Output temp; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Multi-Key get key. + */ + + // Generate binary sortable key for current row in vectorized row batch. + keyVectorSerializeWriteNoNulls.setOutput(currentKeyOutput); + keyVectorSerializeWriteNoNulls.serializeWriteNoNulls(batch, batchIndex); + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || !saveKeyOutput.arraysEquals(currentKeyOutput)) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + hashMapResultCount++; + equalKeySeriesCount++; + break; + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Multi-Key specific save key and lookup. + */ + + temp = saveKeyOutput; + saveKeyOutput = currentKeyOutput; + currentKeyOutput = temp; + + /* + * Multi-Key specific lookup key. + */ + + byte[] keyBytes = saveKeyOutput.getData(); + int keyLength = saveKeyOutput.getLength(); + saveJoinResult = hashMap.lookup(keyBytes, 0, keyLength, hashMapResults[hashMapResultCount]); + + /* + * Common inner join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesHashMapResultIndices[equalKeySeriesCount] = hashMapResultCount; + equalKeySeriesAllMatchIndices[equalKeySeriesCount] = allMatchCount; + equalKeySeriesIsSingleValue[equalKeySeriesCount] = hashMapResults[hashMapResultCount].isSingleRow(); + equalKeySeriesDuplicateCounts[equalKeySeriesCount] = 1; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesDuplicateCounts[equalKeySeriesCount]++; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + hashMapResultCount++; + equalKeySeriesCount++; + break; + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs,allMatchCount) + + " equalKeySeriesHashMapResultIndices " + intArrayToRangesString(equalKeySeriesHashMapResultIndices, equalKeySeriesCount) + + " equalKeySeriesAllMatchIndices " + intArrayToRangesString(equalKeySeriesAllMatchIndices, equalKeySeriesCount) + + " equalKeySeriesIsSingleValue " + Arrays.toString(Arrays.copyOfRange(equalKeySeriesIsSingleValue, 0, equalKeySeriesCount)) + + " equalKeySeriesDuplicateCounts " + Arrays.toString(Arrays.copyOfRange(equalKeySeriesDuplicateCounts, 0, equalKeySeriesCount)) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMapResults, 0, hashMapResultCount))); + } + + numSel = finishInner(batch, + allMatchs, allMatchCount, + equalKeySeriesHashMapResultIndices, equalKeySeriesAllMatchIndices, + equalKeySeriesIsSingleValue, equalKeySeriesDuplicateCounts, + equalKeySeriesCount, + spills, spillHashMapResultIndices, spillCount, + hashMapResults, hashMapResultCount); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerStringOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerStringOperator.java new file mode 100644 index 0000000..3bc225a --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinInnerStringOperator.java @@ -0,0 +1,367 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column String hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; + +// Single-Column String specific imports. +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; + +/* + * Specialized class for doing a vectorized map join that is an inner join on a Single-Column String + * using a hash map. + */ +public class VectorMapJoinInnerStringOperator extends VectorMapJoinInnerGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerStringOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinInnerStringOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashMap hashMap; + + //--------------------------------------------------------------------------- + // Single-Column String specific members. + // + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinInnerStringOperator() { + super(); + } + + public VectorMapJoinInnerStringOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column String Inner Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column String members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column String hash map information for this specialized class. + */ + + hashMap = (VectorMapJoinBytesHashMap) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For inner joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column String specific declarations. + */ + + // The one join column for this specialized class. + BytesColumnVector joinColVector = (BytesColumnVector) batch.cols[singleJoinColumn]; + byte[][] vector = joinColVector.vector; + int[] start = joinColVector.start; + int[] length = joinColVector.length; + + /* + * Single-Column String check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column String specific repeated lookup. + */ + + byte[] keyBytes = vector[0]; + int keyStart = start[0]; + int keyLength = length[0]; + JoinUtil.JoinResult joinResult = hashMap.lookup(keyBytes, keyStart, keyLength, hashMapResults[0]); + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishInnerRepeated(batch, joinResult, hashMapResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashMapResultCount = 0; + int allMatchCount = 0; + int equalKeySeriesCount = 0; + int spillCount = 0; + + /* + * Single-Column String specific variables. + */ + + int saveKeyBatchIndex = -1; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column String get key. + */ + + // Implicit -- use batchIndex. + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || + StringExpr.compare(vector[saveKeyBatchIndex], start[saveKeyBatchIndex], length[saveKeyBatchIndex], + vector[batchIndex], start[batchIndex], length[batchIndex]) != 0) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + hashMapResultCount++; + equalKeySeriesCount++; + break; + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column String specific save key. + */ + + saveKeyBatchIndex = batchIndex; + + /* + * Single-Column String specific lookup key. + */ + + byte[] keyBytes = vector[batchIndex]; + int keyStart = start[batchIndex]; + int keyLength = length[batchIndex]; + saveJoinResult = hashMap.lookup(keyBytes, keyStart, keyLength, hashMapResults[hashMapResultCount]); + + /* + * Common inner join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesHashMapResultIndices[equalKeySeriesCount] = hashMapResultCount; + equalKeySeriesAllMatchIndices[equalKeySeriesCount] = allMatchCount; + equalKeySeriesIsSingleValue[equalKeySeriesCount] = hashMapResults[hashMapResultCount].isSingleRow(); + equalKeySeriesDuplicateCounts[equalKeySeriesCount] = 1; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + equalKeySeriesDuplicateCounts[equalKeySeriesCount]++; + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + hashMapResultCount++; + equalKeySeriesCount++; + break; + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs,allMatchCount) + + " equalKeySeriesHashMapResultIndices " + intArrayToRangesString(equalKeySeriesHashMapResultIndices, equalKeySeriesCount) + + " equalKeySeriesAllMatchIndices " + intArrayToRangesString(equalKeySeriesAllMatchIndices, equalKeySeriesCount) + + " equalKeySeriesIsSingleValue " + Arrays.toString(Arrays.copyOfRange(equalKeySeriesIsSingleValue, 0, equalKeySeriesCount)) + + " equalKeySeriesDuplicateCounts " + Arrays.toString(Arrays.copyOfRange(equalKeySeriesDuplicateCounts, 0, equalKeySeriesCount)) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMapResults, 0, hashMapResultCount))); + } + + numSel = finishInner(batch, + allMatchs, allMatchCount, + equalKeySeriesHashMapResultIndices, equalKeySeriesAllMatchIndices, + equalKeySeriesIsSingleValue, equalKeySeriesDuplicateCounts, + equalKeySeriesCount, + spills, spillHashMapResultIndices, spillCount, + hashMapResults, hashMapResultCount); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiGenerateResultOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiGenerateResultOperator.java new file mode 100644 index 0000000..57571e6 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiGenerateResultOperator.java @@ -0,0 +1,255 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +/** + * This class has methods for generating vectorized join results for left semi joins. + * + * The big difference between inner joins and left semi joins is existence testing. + * + * Inner joins use a hash map to lookup the 1 or more small table values. + * + * Left semi joins are a specialized join for outputting big table rows whose key exists + * in the small table. + * + * No small table values are needed for left semi join since they would be empty. So, + * we use a hash set as the hash table. Hash sets just report whether a key exists. This + * is a big performance optimization. + */ +public abstract class VectorMapJoinLeftSemiGenerateResultOperator + extends VectorMapJoinGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinLeftSemiGenerateResultOperator.class.getName()); + + //--------------------------------------------------------------------------- + // Semi join specific members. + // + + // An array of hash set results so we can do lookups on the whole batch before output result + // generation. + protected transient VectorMapJoinHashSetResult hashSetResults[]; + + // Pre-allocated member for storing the (physical) batch index of matching row (single- or + // multi-small-table-valued) indexes during a process call. + protected transient int[] allMatchs; + + // Pre-allocated member for storing the (physical) batch index of rows that need to be spilled. + protected transient int[] spills; + + // Pre-allocated member for storing index into the hashSetResults for each spilled row. + protected transient int[] spillHashMapResultIndices; + + public VectorMapJoinLeftSemiGenerateResultOperator() { + super(); + } + + public VectorMapJoinLeftSemiGenerateResultOperator(VectorizationContext vContext, OperatorDesc conf) + throws HiveException { + super(vContext, conf); + } + + /* + * Setup our left semi join specific members. + */ + protected void commonSetup(VectorizedRowBatch batch) throws HiveException { + super.commonSetup(batch); + + // Semi join specific. + VectorMapJoinHashSet baseHashSet = (VectorMapJoinHashSet) vectorMapJoinHashTable; + + hashSetResults = new VectorMapJoinHashSetResult[batch.DEFAULT_SIZE]; + for (int i = 0; i < hashSetResults.length; i++) { + hashSetResults[i] = baseHashSet.createHashSetResult(); + } + + allMatchs = new int[batch.DEFAULT_SIZE]; + + spills = new int[batch.DEFAULT_SIZE]; + spillHashMapResultIndices = new int[batch.DEFAULT_SIZE]; + } + + //----------------------------------------------------------------------------------------------- + + /* + * Left semi join (hash set). + */ + + /** + * Generate the left semi join output results for one vectorized row batch. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param allMatchs + * A subset of the rows of the batch that are matches. + * @param allMatchCount + * Number of matches in allMatchs. + * @param spills + * A subset of the rows of the batch that are spills. + * @param spillHashMapResultIndices + * For each entry in spills, the index into the hashTableResults. + * @param spillCount + * Number of spills in spills. + * @param hashTableResults + * The array of all hash table results for the batch. We need the + * VectorMapJoinHashTableResult for the spill information. + */ + protected int finishLeftSemi(VectorizedRowBatch batch, + int[] allMatchs, int allMatchCount, + int[] spills, int[] spillHashMapResultIndices, int spillCount, + VectorMapJoinHashTableResult[] hashTableResults) throws HiveException, IOException { + + int numSel; + + /* + * Optimize by running value expressions only over the matched rows. + */ + if (allMatchCount > 0 && bigTableValueExpressions != null) { + performValueExpressions(batch, allMatchs, allMatchCount); + } + + numSel = generateHashSetResults(batch, allMatchs, allMatchCount); + + if (spillCount > 0) { + spillHashMapBatch(batch, hashTableResults, + spills, spillHashMapResultIndices, spillCount); + } + + return numSel; + } + + /** + * Generate the matching left semi join output results of a vectorized row batch. + * + * @param batch + * The big table batch. + * @param allMatchs + * A subset of the rows of the batch that are matches. + * @param allMatchCount + * Number of matches in allMatchs. + */ + private int generateHashSetResults(VectorizedRowBatch batch, + int[] allMatchs, int allMatchCount) + throws HiveException, IOException { + + int numSel = 0; + + if (!onlyUseOverflowBatch) { + + // Generate result within big table batch itself. + + for (int i = 0; i < allMatchCount; i++) { + + int batchIndex = allMatchs[i]; + + // Use the big table row as output. + batch.selected[numSel++] = batchIndex; + } + } else { + + // Generate result in overflow batch. + + for (int i = 0; i < allMatchCount; i++) { + + int batchIndex = allMatchs[i]; + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, + overflowBatch, overflowBatch.size); + } + + overflowBatch.size++; + if (overflowBatch.size == overflowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + } + } + return numSel; + } + + /** + * Generate the left semi join output results for one vectorized row batch with a repeated key. + * + * @param batch + * The big table batch whose repeated key matches. + */ + protected int generateHashSetResultRepeatedAll(VectorizedRowBatch batch) throws HiveException { + + if (batch.selectedInUse) { + // The selected array is already filled in as we want it. + } else { + int[] selected = batch.selected; + for (int i = 0; i < batch.size; i++) { + selected[i] = i; + } + batch.selectedInUse = true; + } + + return batch.size; + } + + protected int finishLeftSemiRepeated(VectorizedRowBatch batch, JoinUtil.JoinResult joinResult, + VectorMapJoinHashTableResult hashSetResult) throws HiveException, IOException { + + int numSel = 0; + + switch (joinResult) { + case MATCH: + + if (bigTableValueExpressions != null) { + // Run our value expressions over whole batch. + for(VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + } + + // Generate special repeated case. + numSel = generateHashSetResultRepeatedAll(batch); + break; + + case SPILL: + // Whole batch is spilled. + spillBatchRepeated(batch, (VectorMapJoinHashTableResult) hashSetResult); + break; + + case NOMATCH: + // No match for entire batch. + break; + } + + return numSel; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiLongOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiLongOperator.java new file mode 100644 index 0000000..dd614da --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiLongOperator.java @@ -0,0 +1,366 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column Long hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashSet; + +// Single-Column Long specific imports. +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; + +/* + * Specialized class for doing a vectorized map join that is an left semi join on a Single-Column Long + * using a hash set. + */ +public class VectorMapJoinLeftSemiLongOperator extends VectorMapJoinLeftSemiGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyLongOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinLeftSemiLongOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinLongHashSet hashSet; + + //--------------------------------------------------------------------------- + // Single-Column Long specific members. + // + + // For integers, we have optional min/max filtering. + private transient boolean useMinMax; + private transient long min; + private transient long max; + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinLeftSemiLongOperator() { + super(); + } + + public VectorMapJoinLeftSemiLongOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column Long Left-Semi Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column Long members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column Long hash set information for this specialized class. + */ + + hashSet = (VectorMapJoinLongHashSet) vectorMapJoinHashTable; + useMinMax = hashSet.useMinMax(); + if (useMinMax) { + min = hashSet.min(); + max = hashSet.max(); + } + + needHashTableSetup = false; + } + + batchCounter++; + + // For left semi joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column Long specific declarations. + */ + + // The one join column for this specialized class. + LongColumnVector joinColVector = (LongColumnVector) batch.cols[singleJoinColumn]; + long[] vector = joinColVector.vector; + + /* + * Single-Column Long check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column Long specific repeated lookup. + */ + + long key = vector[0]; + JoinUtil.JoinResult joinResult; + if (useMinMax && (key < min || key > max)) { + // Out of range for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + joinResult = hashSet.contains(key, hashSetResults[0]); + } + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishLeftSemiRepeated(batch, joinResult, hashSetResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashSetResultCount = 0; + int allMatchCount = 0; + int spillCount = 0; + + /* + * Single-Column Long specific variables. + */ + + long saveKey = 0; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column Long get key. + */ + + long currentKey = vector[batchIndex]; + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || currentKey != saveKey) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + // We have extracted the existence from the hash set result, so we don't keep it. + break; + case SPILL: + // We keep the hash set result for its spill information. + hashSetResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column Long specific save key. + */ + + saveKey = currentKey; + + /* + * Single-Column Long specific lookup key. + */ + + if (useMinMax && (currentKey < min || currentKey > max)) { + // Key out of range for whole hash table. + saveJoinResult = JoinUtil.JoinResult.NOMATCH; + } else { + saveJoinResult = hashSet.contains(currentKey, hashSetResults[hashSetResultCount]); + } + + /* + * Common left-semi join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + // We have extracted the existence from the hash set result, so we don't keep it. + break; + case SPILL: + // We keep the hash set result for its spill information. + hashSetResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs, allMatchCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashSetResults, 0, hashSetResultCount))); + } + + numSel = finishLeftSemi(batch, + allMatchs, allMatchCount, + spills, spillHashMapResultIndices, spillCount, + (VectorMapJoinHashTableResult[]) hashSetResults); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiMultiKeyOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiMultiKeyOperator.java new file mode 100644 index 0000000..cf4f312 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiMultiKeyOperator.java @@ -0,0 +1,378 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Multi-Key hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashSet; + +// Multi-Key specific imports. +import org.apache.hadoop.hive.ql.exec.vector.VectorSerializeRowNoNulls; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableSerializeWrite; + +/* + * Specialized class for doing a vectorized map join that is an left semi join on Multi-Key + * using hash set. + */ +public class VectorMapJoinLeftSemiMultiKeyOperator extends VectorMapJoinLeftSemiGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyLongOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinLeftSemiMultiKeyOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashSet hashSet; + + //--------------------------------------------------------------------------- + // Multi-Key specific members. + // + + // Object that can take a set of columns in row in a vectorized row batch and serialized it. + // Known to not have any nulls. + private transient VectorSerializeRowNoNulls keyVectorSerializeWriteNoNulls; + + // The BinarySortable serialization of the current key. + private transient Output currentKeyOutput; + + // The BinarySortable serialization of the saved key for a possible series of equal keys. + private transient Output saveKeyOutput; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinLeftSemiMultiKeyOperator() { + super(); + } + + public VectorMapJoinLeftSemiMultiKeyOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Multi-Key Left-Semi Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Multi-Key members for this specialized class. + */ + + keyVectorSerializeWriteNoNulls = new VectorSerializeRowNoNulls( + new BinarySortableSerializeWrite(bigTableKeyColumnMap.length)); + keyVectorSerializeWriteNoNulls.init(bigTableKeyTypeNames, bigTableKeyColumnMap); + + currentKeyOutput = new Output(); + saveKeyOutput = new Output(); + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Multi-Key hash set information for this specialized class. + */ + + hashSet = (VectorMapJoinBytesHashSet) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For left semi joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Multi-Key specific declarations. + */ + + // None. + + /* + * Multi-Key Long check for repeating. + */ + + // If all BigTable input columns to key expressions are isRepeating, then + // calculate key once; lookup once. + boolean allKeyInputColumnsRepeating; + if (bigTableKeyColumnMap.length == 0) { + allKeyInputColumnsRepeating = false; + } else { + allKeyInputColumnsRepeating = true; + for (int i = 0; i < bigTableKeyColumnMap.length; i++) { + if (!batch.cols[bigTableKeyColumnMap[i]].isRepeating) { + allKeyInputColumnsRepeating = false; + break; + } + } + } + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Multi-Key specific repeated lookup. + */ + + keyVectorSerializeWriteNoNulls.setOutput(currentKeyOutput); + keyVectorSerializeWriteNoNulls.serializeWriteNoNulls(batch, 0); + byte[] keyBytes = currentKeyOutput.getData(); + int keyLength = currentKeyOutput.getLength(); + // LOG.debug(CLASS_NAME + " processOp all " + displayBytes(keyBytes, 0, keyLength)); + JoinUtil.JoinResult joinResult = hashSet.contains(keyBytes, 0, keyLength, hashSetResults[0]); + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishLeftSemiRepeated(batch, joinResult, hashSetResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashSetResultCount = 0; + int allMatchCount = 0; + int spillCount = 0; + + /* + * Multi-Key specific variables. + */ + + Output temp; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Multi-Key get key. + */ + + // Generate binary sortable key for current row in vectorized row batch. + keyVectorSerializeWriteNoNulls.setOutput(currentKeyOutput); + keyVectorSerializeWriteNoNulls.serializeWriteNoNulls(batch, batchIndex); + + // LOG.debug(CLASS_NAME + " currentKey " + + // VectorizedBatchUtil.displayBytes(currentKeyOutput.getData(), 0, currentKeyOutput.getLength())); + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || !saveKeyOutput.arraysEquals(currentKeyOutput)) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + // We have extracted the existence from the hash set result, so we don't keep it. + break; + case SPILL: + // We keep the hash set result for its spill information. + hashSetResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Multi-Key specific save key and lookup. + */ + + temp = saveKeyOutput; + saveKeyOutput = currentKeyOutput; + currentKeyOutput = temp; + + byte[] keyBytes = saveKeyOutput.getData(); + int keyLength = saveKeyOutput.getLength(); + saveJoinResult = hashSet.contains(keyBytes, 0, keyLength, hashSetResults[hashSetResultCount]); + + /* + * Common left-semi join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + // We have extracted the existence from the hash set result, so we don't keep it. + break; + case SPILL: + // We keep the hash set result for its spill information. + hashSetResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs, allMatchCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashSetResults, 0, hashSetResultCount))); + } + + numSel = finishLeftSemi(batch, + allMatchs, allMatchCount, + spills, spillHashMapResultIndices, spillCount, + (VectorMapJoinHashTableResult[]) hashSetResults); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiStringOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiStringOperator.java new file mode 100644 index 0000000..12d663c --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinLeftSemiStringOperator.java @@ -0,0 +1,351 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column String hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashSet; + +// Single-Column String specific imports. +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; + +/* + * Specialized class for doing a vectorized map join that is an left semi join on a Single-Column String + * using a hash set. + */ +public class VectorMapJoinLeftSemiStringOperator extends VectorMapJoinLeftSemiGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinInnerBigOnlyLongOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinLeftSemiStringOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashSet hashSet; + + //--------------------------------------------------------------------------- + // Single-Column String specific members. + // + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinLeftSemiStringOperator() { + super(); + } + + public VectorMapJoinLeftSemiStringOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column String Left-Semi Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column String members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column String hash set information for this specialized class. + */ + + hashSet = (VectorMapJoinBytesHashSet) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For left semi joins, we may apply the filter(s) now. + for(VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column String specific declarations. + */ + + // The one join column for this specialized class. + BytesColumnVector joinColVector = (BytesColumnVector) batch.cols[singleJoinColumn]; + byte[][] vector = joinColVector.vector; + int[] start = joinColVector.start; + int[] length = joinColVector.length; + + /* + * Single-Column Long check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column String specific repeated lookup. + */ + + byte[] keyBytes = vector[0]; + int keyStart = start[0]; + int keyLength = length[0]; + JoinUtil.JoinResult joinResult = hashSet.contains(keyBytes, keyStart, keyLength, hashSetResults[0]); + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishLeftSemiRepeated(batch, joinResult, hashSetResults[0]); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + // We remember any matching rows in matchs / matchSize. At the end of the loop, + // selected / batch.size will represent both matching and non-matching rows for outer join. + // Only deferred rows will have been removed from selected. + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + int hashSetResultCount = 0; + int allMatchCount = 0; + int spillCount = 0; + + /* + * Single-Column String specific variables. + */ + + int saveKeyBatchIndex = -1; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column String get key. + */ + + // Implicit -- use batchIndex. + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || + StringExpr.compare(vector[saveKeyBatchIndex], start[saveKeyBatchIndex], length[saveKeyBatchIndex], + vector[batchIndex], start[batchIndex], length[batchIndex]) != 0) { + + // New key. + + if (haveSaveKey) { + // Move on with our counts. + switch (saveJoinResult) { + case MATCH: + // We have extracted the existence from the hash set result, so we don't keep it. + break; + case SPILL: + // We keep the hash set result for its spill information. + hashSetResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column String specific save key and lookup. + */ + + saveKeyBatchIndex = batchIndex; + + byte[] keyBytes = vector[batchIndex]; + int keyStart = start[batchIndex]; + int keyLength = length[batchIndex]; + saveJoinResult = hashSet.contains(keyBytes, keyStart, keyLength, hashSetResults[hashSetResultCount]); + + /* + * Common left-semi join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH isSingleValue " + equalKeySeriesIsSingleValue[equalKeySeriesCount] + " currentKey " + currentKey); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH" + " currentKey " + currentKey); + break; + } + } else { + // Series of equal keys. + + switch (saveJoinResult) { + case MATCH: + allMatchs[allMatchCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " MATCH duplicate"); + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashSetResultCount; + spillCount++; + break; + + case NOMATCH: + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Update our counts for the last key. + switch (saveJoinResult) { + case MATCH: + // We have extracted the existence from the hash set result, so we don't keep it. + break; + case SPILL: + // We keep the hash set result for its spill information. + hashSetResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + + " allMatchs " + intArrayToRangesString(allMatchs, allMatchCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashSetResults, 0, hashSetResultCount))); + } + + numSel = finishLeftSemi(batch, + allMatchs, allMatchCount, + spills, spillHashMapResultIndices, spillCount, + (VectorMapJoinHashTableResult[]) hashSetResults); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterGenerateResultOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterGenerateResultOperator.java new file mode 100644 index 0000000..efdf0b2 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterGenerateResultOperator.java @@ -0,0 +1,690 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; +import org.apache.hadoop.hive.serde2.WriteBuffers.ByteSegmentRef; + +/** + * This class has methods for generating vectorized join results for outer joins. + * + * The big difference between inner joins and outer joins is the treatment of null and non-matching + * keys. + * + * Inner joins ignore null keys. Outer joins include big table rows with null keys in the result. + * + * (Left non-full) outer joins include big table rows that do not match the small table. Small + * table columns for non-matches will be NULL. + * + * Another important difference is filtering. For outer joins to include the necessary rows, + * filtering must be done after the hash table lookup. That is because filtering does not + * eliminate rows, but changes them from match to non-matching rows. They will still appear in + * the join result. + * + * One vector outer join optimization is referencing bytes outer keys. When a bytes key appears + * in the small table results area, instead of copying the bytes key we reference the big table key. + * Bytes column vectors allow a by reference entry to bytes. It is safe to do a by reference + * since it is within the same row. + * + * Outer join uses a hash map since small table columns can be included in the join result. + */ +public abstract class VectorMapJoinOuterGenerateResultOperator + extends VectorMapJoinGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinOuterGenerateResultOperator.class.getName()); + + //--------------------------------------------------------------------------- + // Outer join specific members. + // + + // An array of hash map results so we can do lookups on the whole batch before output result + // generation. + protected transient VectorMapJoinHashMapResult hashMapResults[]; + + // Pre-allocated member for storing any matching row indexes during a processOp call. + protected transient int[] matchs; + + // Pre-allocated member for storing the mapping to the row batchIndex of the first of a series of + // equal keys that was looked up during a processOp call. + protected transient int[] matchHashMapResultIndices; + + // All matching and non-matching big table rows. + protected transient int[] nonSpills; + + // Pre-allocated member for storing the (physical) batch index of rows that need to be spilled. + protected transient int[] spills; + + // Pre-allocated member for storing index into the hashSetResults for each spilled row. + protected transient int[] spillHashMapResultIndices; + + // Pre-allocated member for storing any non-matching row indexes during a processOp call. + protected transient int[] scratch1; + + public VectorMapJoinOuterGenerateResultOperator() { + super(); + } + + public VectorMapJoinOuterGenerateResultOperator(VectorizationContext vContext, OperatorDesc conf) + throws HiveException { + super(vContext, conf); + } + + /* + * Setup our outer join specific members. + */ + protected void commonSetup(VectorizedRowBatch batch) throws HiveException { + super.commonSetup(batch); + + // Outer join specific. + VectorMapJoinHashMap baseHashMap = (VectorMapJoinHashMap) vectorMapJoinHashTable; + + hashMapResults = new VectorMapJoinHashMapResult[batch.DEFAULT_SIZE]; + for (int i = 0; i < hashMapResults.length; i++) { + hashMapResults[i] = baseHashMap.createHashMapResult(); + } + matchs = new int[batch.DEFAULT_SIZE]; + matchHashMapResultIndices = new int[batch.DEFAULT_SIZE]; + nonSpills = new int[batch.DEFAULT_SIZE]; + spills = new int[batch.DEFAULT_SIZE]; + spillHashMapResultIndices = new int[batch.DEFAULT_SIZE]; + scratch1 = new int[batch.DEFAULT_SIZE]; + } + + //----------------------------------------------------------------------------------------------- + + /* + * Outer join (hash map). + */ + + /** + * Generate the outer join output results for one vectorized row batch. + * + * Any filter expressions will apply now since hash map lookup for outer join is complete. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param matchs + * A subset of the rows of the batch that are matches. + * @param matchHashMapResultIndices + * For each entry in matches, the index into the hashMapResult. + * @param matchSize + * Number of matches in matchs. + * @param nonSpills + * The rows of the batch that are both matches and non-matches. + * @param nonspillCount + * Number of rows in nonSpills. + * @param spills + * A subset of the rows of the batch that are spills. + * @param spillHashMapResultIndices + * For each entry in spills, the index into the hashMapResult. + * @param spillCount + * Number of spills in spills. + * @param hashMapResults + * The array of all hash map results for the batch. + * @param hashMapResultCount + * Number of entries in hashMapResults. + * @param scratch1 + * Pre-allocated storage to internal use. + */ + public int finishOuter(VectorizedRowBatch batch, + int[] matchs, int[] matchHashMapResultIndices, int matchCount, + int[] nonSpills, int nonSpillCount, + int[] spills, int[] spillHashMapResultIndices, int spillCount, + VectorMapJoinHashMapResult[] hashMapResults, int hashMapResultCount, + int[] scratch1) throws IOException, HiveException { + + int numSel = 0; + + // At this point we have determined the matching rows only for the ON equality condition(s). + // Implicitly, non-matching rows are those in the selected array minus matchs. + + // Next, for outer join, apply any ON predicates to filter down the matches. + if (matchCount > 0 && bigTableFilterExpressions.length > 0) { + + System.arraycopy(matchs, 0, batch.selected, 0, matchCount); + batch.size = matchCount; + + // Non matches will be removed from the selected array. + for (VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + // LOG.info("finishOuter" + + // " filtered batch.selected " + Arrays.toString(Arrays.copyOfRange(batch.selected, 0, batch.size))); + + // Fixup the matchHashMapResultIndices array. + if (batch.size < matchCount) { + int numMatch = 0; + int[] selected = batch.selected; + for (int i = 0; i < batch.size; i++) { + if (selected[i] == matchs[numMatch]) { + matchHashMapResultIndices[numMatch] = matchHashMapResultIndices[i]; + numMatch++; + if (numMatch == matchCount) { + break; + } + } + } + System.arraycopy(batch.selected, 0, matchs, 0, matchCount); + } + } + // LOG.info("finishOuter" + + // " matchs[" + matchCount + "] " + intArrayToRangesString(matchs, matchCount) + + // " matchHashMapResultIndices " + Arrays.toString(Arrays.copyOfRange(matchHashMapResultIndices, 0, matchCount))); + + // Big table value expressions apply to ALL matching and non-matching rows. + if (bigTableValueExpressions != null) { + + System.arraycopy(nonSpills, 0, batch.selected, 0, nonSpillCount); + batch.size = nonSpillCount; + + for (VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + } + + // Determine which rows are non matches by determining the delta between selected and + // matchs. + int[] noMatchs = scratch1; + int noMatchCount = 0; + if (matchCount < nonSpillCount) { + // Determine which rows are non matches. + int matchIndex = 0; + for (int i = 0; i < nonSpillCount; i++) { + int candidateIndex = nonSpills[i]; + if (matchIndex < matchCount && candidateIndex == matchs[matchIndex]) { + matchIndex++; + } else { + noMatchs[noMatchCount++] = candidateIndex; + } + } + } + // LOG.info("finishOuter" + + // " noMatchs[" + noMatchCount + "] " + intArrayToRangesString(noMatchs, noMatchCount)); + + + // When we generate results into the overflow batch, we may still end up with fewer rows + // in the big table batch. So, nulSel and the batch's selected array will be rebuilt with + // just the big table rows that need to be forwarded, minus any rows processed with the + // overflow batch. + if (matchCount > 0) { + numSel = generateOuterHashMapMatchResults(batch, + matchs, matchHashMapResultIndices, matchCount, + hashMapResults, numSel); + } + + if (noMatchCount > 0) { + numSel = generateOuterHashMapNoMatchResults(batch, noMatchs, noMatchCount, numSel); + } + + if (spillCount > 0) { + spillHashMapBatch(batch, (VectorMapJoinHashTableResult[]) hashMapResults, + spills, spillHashMapResultIndices, spillCount); + } + + return numSel; + } + + /** + * Generate the matching outer join output results for one row of a vectorized row batch into + * the overflow batch. + * + * @param batch + * The big table batch. + * @param batchIndex + * Index of the big table row. + * @param hashMapResult + * The hash map result with the small table values. + */ + private void copyOuterHashMapResultToOverflow(VectorizedRowBatch batch, int batchIndex, + VectorMapJoinHashMapResult hashMapResult) throws HiveException, IOException { + + // if (hashMapResult.isCappedCountAvailable()) { + // LOG.info("copyOuterHashMapResultToOverflow cappedCount " + hashMapResult.cappedCount()); + // } + ByteSegmentRef byteSegmentRef = hashMapResult.first(); + while (byteSegmentRef != null) { + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, + overflowBatch, overflowBatch.size); + } + + // Reference the keys we just copied above. + if (bigTableVectorCopyOuterKeys != null) { + bigTableVectorCopyOuterKeys.copyByReference(overflowBatch, overflowBatch.size, + overflowBatch, overflowBatch.size); + } + + if (smallTableVectorDeserializeRow != null) { + + byte[] bytes = byteSegmentRef.getBytes(); + int offset = (int) byteSegmentRef.getOffset(); + int length = byteSegmentRef.getLength(); + smallTableVectorDeserializeRow.setBytes(bytes, offset, length); + + smallTableVectorDeserializeRow.deserializeByValue(overflowBatch, overflowBatch.size); + } + + ++overflowBatch.size; + if (overflowBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + + byteSegmentRef = hashMapResult.next(); + } + // LOG.info("copyOuterHashMapResultToOverflow overflowBatch.size " + overflowBatch.size); + + } + + /** + * Generate the matching outer join output results for one vectorized row batch. + * + * For each matching row specified by parameter, get the one or more small table values and + * form join results. + * + * (Note: Since all matching and non-matching rows are selected and output for outer joins, + * we cannot use selected as the matching rows). + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param matchs + * A subset of the rows of the batch that are matches. + * @param matchHashMapResultIndices + * For each entry in matches, the index into the hashMapResult. + * @param matchSize + * Number of matches in matchs. + * @param hashMapResults + * The array of all hash map results for the batch. + * @param numSel + * The current count of rows in the rebuilding of the selected array. + * + * @return + * The new count of selected rows. + */ + protected int generateOuterHashMapMatchResults(VectorizedRowBatch batch, + int[] matchs, int[] matchHashMapResultIndices, int matchSize, + VectorMapJoinHashMapResult[] hashMapResults, int numSel) + throws IOException, HiveException { + + int[] selected = batch.selected; + + if (onlyUseOverflowBatch) { + + // Do not use the big table batch for output results. Copy everything to the overflow batch. + + for (int i = 0; i < matchSize; i++) { + int batchIndex = matchs[i]; + + int hashMapResultIndex = matchHashMapResultIndices[i]; + VectorMapJoinHashMapResult hashMapResult = hashMapResults[hashMapResultIndex]; + + // TODO: We could try to look ahead and see equal keys and do a N x M generate. + + copyOuterHashMapResultToOverflow(batch, batchIndex, hashMapResult); + } + + // Unchanged (we did not remember anything in the selected array). + return numSel; + } + + // Attempt to generate result within big table batch. + + for (int i = 0; i < matchSize; i++) { + int batchIndex = matchs[i]; + + int hashMapResultIndex = matchHashMapResultIndices[i]; + VectorMapJoinHashMapResult hashMapResult = hashMapResults[hashMapResultIndex]; + + if (!hashMapResult.isSingleRow()) { + + // Multiple small table rows require use of the overflow batch. + copyOuterHashMapResultToOverflow(batch, batchIndex, hashMapResult); + } else { + + // Generate join result in big table batch. + ByteSegmentRef byteSegmentRef = hashMapResult.first(); + + if (bigTableVectorCopyOuterKeys != null) { + bigTableVectorCopyOuterKeys.copyByReference(batch, batchIndex, batch, batchIndex); + } + + if (smallTableVectorDeserializeRow != null) { + + byte[] bytes = byteSegmentRef.getBytes(); + int offset = (int) byteSegmentRef.getOffset(); + int length = byteSegmentRef.getLength(); + smallTableVectorDeserializeRow.setBytes(bytes, offset, length); + + smallTableVectorDeserializeRow.deserializeByValue(batch, batchIndex); + } + + // Remember this big table row was used for an output result. + selected[numSel++] = batchIndex; + } + } + return numSel; + } + + /** + * Generate the non matching outer join output results for one vectorized row batch. + * + * For each non matching row specified by parameter, generate nulls for the small table results. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param noMatchs + * A subset of the rows of the batch that are non matches. + * @param noMatchSize + * Number of non matches in noMatchs. + * @param numSel + * The current count of rows in the rebuilding of the selected array. + * + * @return + * The new count of selected rows. + */ + protected int generateOuterHashMapNoMatchResults(VectorizedRowBatch batch, int[] noMatchs, + int noMatchSize, int numSel) throws IOException, HiveException { + int[] selected = batch.selected; + + if (onlyUseOverflowBatch) { + + // Do not use the big table batch for output results. Copy everything to the overflow batch. + + for (int i = 0; i < noMatchSize; i++) { + int batchIndex = noMatchs[i]; + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, batchIndex, overflowBatch, overflowBatch.size); + } + + // Mark any scratch small table scratch columns that would normally receive a copy of the + // key as null, too. + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + ColumnVector colVector = overflowBatch.cols[column]; + colVector.noNulls = false; + colVector.isNull[overflowBatch.size] = true; + } + + // Small table values are set to null. + for (int column : smallTableMapping.getOutputColumns()) { + ColumnVector colVector = overflowBatch.cols[column]; + colVector.noNulls = false; + colVector.isNull[overflowBatch.size] = true; + } + + ++overflowBatch.size; + if (overflowBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + } + + return numSel; + } + + // Generate result within big table batch with null small table results, using isRepeated + // if possible. + + if (numSel == 0) { + + // There were 0 matching rows -- so we can use the isRepeated optimization for the non + // matching rows. + + // Mark any scratch small table scratch columns that would normally receive a copy of the + // key as null and repeating. + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + ColumnVector colVector = batch.cols[column]; + colVector.isRepeating = true; + colVector.noNulls = false; + colVector.isNull[0] = true; + } + + // Small table values are set to null and repeating. + for (int column : smallTableMapping.getOutputColumns()) { + ColumnVector colVector = batch.cols[column]; + colVector.isRepeating = true; + colVector.noNulls = false; + colVector.isNull[0] = true; + } + + // Rebuild the selected array. + for (int i = 0; i < noMatchSize; i++) { + int batchIndex = noMatchs[i]; + selected[numSel++] = batchIndex; + } + } else { + + // Set null information in the small table results area. + + for (int i = 0; i < noMatchSize; i++) { + int batchIndex = noMatchs[i]; + + // Mark any scratch small table scratch columns that would normally receive a copy of the + // key as null, too. + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + ColumnVector colVector = batch.cols[column]; + colVector.noNulls = false; + colVector.isNull[batchIndex] = true; + } + + // Small table values are set to null. + for (int column : smallTableMapping.getOutputColumns()) { + ColumnVector colVector = batch.cols[column]; + colVector.noNulls = false; + colVector.isNull[batchIndex] = true; + } + + selected[numSel++] = batchIndex; + } + } + return numSel; + } + + /** + * Generate the outer join output results for one vectorized row batch with a repeated key. + * + * Any filter expressions will apply now since hash map lookup for outer join is complete. + * + * @param batch + * The big table batch with any matching and any non matching rows both as + * selected in use. + * @param joinResult + * The hash map lookup result for the repeated key. + * @param hashMapResults + * The array of all hash map results for the batch. + * @param scratch1 + * Pre-allocated storage to internal use. + */ + public int finishOuterRepeated(VectorizedRowBatch batch, JoinUtil.JoinResult joinResult, + VectorMapJoinHashMapResult hashMapResult, int[] scratch1) + throws IOException, HiveException { + + int numSel = 0; + + if (joinResult == JoinUtil.JoinResult.MATCH && bigTableFilterExpressions.length > 0) { + + // Since it is repeated, the evaluation of the filter will knock the whole batch out. + // But since we are doing outer join, we want to keep non-matches. + + // First, remember selected; + int[] rememberSelected = scratch1; + int rememberBatchSize = batch.size; + if (batch.selectedInUse) { + System.arraycopy(batch.selected, 0, rememberSelected, 0, batch.size); + } + + // Filter. + for (VectorExpression ve : bigTableFilterExpressions) { + ve.evaluate(batch); + } + + // Convert a filter out to a non match. + if (batch.size == 0) { + joinResult = JoinUtil.JoinResult.NOMATCH; + if (batch.selectedInUse) { + System.arraycopy(rememberSelected, 0, batch.selected, 0, rememberBatchSize); + // LOG.info("finishOuterRepeated batch #" + batchCounter + " filter out converted to no matchs " + + // Arrays.toString(Arrays.copyOfRange(batch.selected, 0, rememberBatchSize))); + } else { + // LOG.info("finishOuterRepeated batch #" + batchCounter + " filter out converted to no matchs batch size " + + // rememberBatchSize); + } + batch.size = rememberBatchSize; + } + } + + // LOG.info("finishOuterRepeated batch #" + batchCounter + " " + joinResult.name() + " batch.size " + batch.size); + switch (joinResult) { + case MATCH: + // Run our value expressions over whole batch. + if (bigTableValueExpressions != null) { + for(VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + } + + // Use a common method applicable for inner and outer. + numSel = generateHashMapResultRepeatedAll(batch, hashMapResult); + break; + case SPILL: + // Whole batch is spilled. + spillBatchRepeated(batch, (VectorMapJoinHashTableResult) hashMapResult); + break; + case NOMATCH: + // Run our value expressions over whole batch. + if (bigTableValueExpressions != null) { + for(VectorExpression ve: bigTableValueExpressions) { + ve.evaluate(batch); + } + } + + numSel = generateOuterNullsRepeatedAll(batch); + break; + } + + return numSel; + } + + /** + * Generate the non-match outer join output results for the whole repeating vectorized + * row batch. + * + * Each row will get nulls for all small table values. + * + * @param batch + * The big table batch. + * @return + * The new count of selected rows. + */ + protected int generateOuterNullsRepeatedAll(VectorizedRowBatch batch) throws HiveException { + + int[] selected = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + if (onlyUseOverflowBatch) { + + for (int i = 0; i < batch.size; i++) { + int index = (selectedInUse ? selected[i] : i); + + // Copy the BigTable values into the overflow batch. Since the overflow batch may + // not get flushed here, we must copy by value. + if (bigTableRetainedVectorCopy != null) { + bigTableRetainedVectorCopy.copyByValue(batch, index, overflowBatch, overflowBatch.size); + } + + // Mark any scratch small table scratch columns that would normally receive a copy of the key + // as null, too. + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + ColumnVector colVector = overflowBatch.cols[column]; + colVector.noNulls = false; + colVector.isNull[overflowBatch.size] = true; + } + + for (int column : smallTableMapping.getOutputColumns()) { + ColumnVector colVector = overflowBatch.cols[column]; + colVector.noNulls = false; + colVector.isNull[overflowBatch.size] = true; + } + + ++overflowBatch.size; + if (overflowBatch.size == VectorizedRowBatch.DEFAULT_SIZE) { + forwardOverflow(); + } + } + // LOG.info("generateOuterNullsRepeatedAll " + batch.size); + + // We only used the overflow batch. + return 0; + } + + // Generate result within big table batch using is repeated for null small table results. + + if (batch.selectedInUse) { + // The selected array is already filled in as we want it. + } else { + for (int i = 0; i < batch.size; i++) { + selected[i] = i; + } + batch.selectedInUse = true; + } + + for (int column : smallTableMapping.getOutputColumns()) { + ColumnVector colVector = batch.cols[column]; + colVector.noNulls = false; + colVector.isNull[0] = true; + colVector.isRepeating = true; + } + + // Mark any scratch small table scratch columns that would normally receive a copy of the key + // as null, too. + for (int column : bigTableOuterKeyMapping.getOutputColumns()) { + ColumnVector colVector = batch.cols[column]; + colVector.noNulls = false; + colVector.isNull[0] = true; + colVector.isRepeating = true; + } + + // for (int i = 0; i < batch.size; i++) { + // int bigTableIndex = selected[i]; + // VectorizedBatchUtil.debugDisplayOneRow(batch, bigTableIndex, taskName + ", " + getOperatorId() + " VectorMapJoinCommonOperator generate generateOuterNullsRepeatedAll batch"); + // } + + return batch.size; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterLongOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterLongOperator.java new file mode 100644 index 0000000..8f18672 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterLongOperator.java @@ -0,0 +1,376 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column Long hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMap; + +// Single-Column Long specific imports. +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; + +/* + * Specialized class for doing a vectorized map join that is an outer join on a Single-Column Long + * using a hash map. + */ +public class VectorMapJoinOuterLongOperator extends VectorMapJoinOuterGenerateResultOperator { + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinOuterLongOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinOuterLongOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinLongHashMap hashMap; + + //--------------------------------------------------------------------------- + // Single-Column Long specific members. + // + + // For integers, we have optional min/max filtering. + private transient boolean useMinMax; + private transient long min; + private transient long max; + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinOuterLongOperator() { + super(); + } + + public VectorMapJoinOuterLongOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column Long Outer Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column Long members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column Long hash map information for this specialized class. + */ + + hashMap = (VectorMapJoinLongHashMap) vectorMapJoinHashTable; + useMinMax = hashMap.useMinMax(); + if (useMinMax) { + min = hashMap.min(); + max = hashMap.max(); + } + + needHashTableSetup = false; + } + + batchCounter++; + + // For outer join, DO NOT apply filters yet. It is incorrect for outer join to + // apply the filter before hash table matching. + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column Long specific declarations. + */ + + // The one join column for this specialized class. + LongColumnVector joinColVector = (LongColumnVector) batch.cols[singleJoinColumn]; + long[] vector = joinColVector.vector; + + /* + * Single-Column Long check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column Long specific repeated lookup. + */ + + JoinUtil.JoinResult joinResult; + if (!joinColVector.noNulls && joinColVector.isNull[0]) { + // Null key is no match for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + // Handle *repeated* join key, if found. + long key = vector[0]; + if (useMinMax && (key < min || key > max)) { + // Out of range for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + joinResult = hashMap.lookup(key, hashMapResults[0]); + } + } + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishOuterRepeated(batch, joinResult, hashMapResults[0], scratch1); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + // For outer join we must apply the filter after match and cause some matches to become + // non-matches, we do not track non-matches here. Instead we remember all non spilled rows + // and compute non matches later in finishOuter. + int hashMapResultCount = 0; + int matchCount = 0; + int nonSpillCount = 0; + int spillCount = 0; + + /* + * Single-Column Long specific variables. + */ + + long saveKey = 0; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column Long outer null detection. + */ + + boolean isNull = !joinColVector.noNulls && joinColVector.isNull[batchIndex]; + + if (isNull) { + + // Have that the NULL does not interfere with the current equal key series, if there + // is one. We do not set saveJoinResult. + // + // Let a current MATCH equal key series keep going, or + // Let a current SPILL equal key series keep going, or + // Let a current NOMATCH keep not matching. + + // Remember non-matches for Outer Join. + nonSpills[nonSpillCount++] = batchIndex; + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " NULL"); + } else { + + /* + * Single-Column Long outer get key. + */ + + long currentKey = vector[batchIndex]; + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || currentKey != saveKey) { + // New key. + + if (haveSaveKey) { + // Move on with our count(s). + switch (saveJoinResult) { + case MATCH: + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column Long specific save key. + */ + + saveKey = currentKey; + + /* + * Single-Column Long specific lookup key. + */ + + if (useMinMax && (currentKey < min || currentKey > max)) { + // Key out of range for whole hash table. + saveJoinResult = JoinUtil.JoinResult.NOMATCH; + } else { + saveJoinResult = hashMap.lookup(currentKey, hashMapResults[hashMapResultCount]); + } + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " New Key " + saveJoinResult.name()); + } else { + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " Key Continues " + saveJoinResult.name()); + } + + /* + * Common outer join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + matchs[matchCount] = batchIndex; + matchHashMapResultIndices[matchCount] = hashMapResultCount; + matchCount++; + nonSpills[nonSpillCount++] = batchIndex; + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + nonSpills[nonSpillCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Account for last equal key sequence. + switch (saveJoinResult) { + case MATCH: + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + + " matchs " + intArrayToRangesString(matchs, matchCount) + + " matchHashMapResultIndices " + intArrayToRangesString(matchHashMapResultIndices, matchCount) + + " nonSpills " + intArrayToRangesString(nonSpills, nonSpillCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMapResults, 0, hashMapResultCount))); + } + + // We will generate results for all matching and non-matching rows. + // Note that scratch1 is undefined at this point -- it's preallocated storage. + numSel = finishOuter(batch, + matchs, matchHashMapResultIndices, matchCount, + nonSpills, nonSpillCount, + spills, spillHashMapResultIndices, spillCount, + hashMapResults, hashMapResultCount, + scratch1); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterMultiKeyOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterMultiKeyOperator.java new file mode 100644 index 0000000..ffee959 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterMultiKeyOperator.java @@ -0,0 +1,398 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Multi-Key hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; + +// Multi-Key specific imports. +import org.apache.hadoop.hive.ql.exec.vector.VectorSerializeRow; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableSerializeWrite; + +/* + * Specialized class for doing a vectorized map join that is an outer join on Multi-Key + * using a hash map. + */ +public class VectorMapJoinOuterMultiKeyOperator extends VectorMapJoinOuterGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinOuterMultiKeyOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinOuterMultiKeyOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashMap hashMap; + + //--------------------------------------------------------------------------- + // Multi-Key specific members. + // + + // Object that can take a set of columns in row in a vectorized row batch and serialized it. + private transient VectorSerializeRow keyVectorSerializeWrite; + + // The BinarySortable serialization of the current key. + private transient Output currentKeyOutput; + + // The BinarySortable serialization of the saved key for a possible series of equal keys. + private transient Output saveKeyOutput; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinOuterMultiKeyOperator() { + super(); + } + + public VectorMapJoinOuterMultiKeyOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Multi-Key Outer Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Multi-Key members for this specialized class. + */ + + keyVectorSerializeWrite = new VectorSerializeRow( + new BinarySortableSerializeWrite(bigTableKeyColumnMap.length)); + keyVectorSerializeWrite.init(bigTableKeyTypeNames, bigTableKeyColumnMap); + + currentKeyOutput = new Output(); + saveKeyOutput = new Output(); + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Multi-Key hash map information for this specialized class. + */ + + hashMap = (VectorMapJoinBytesHashMap) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For outer join, DO NOT apply filters yet. It is incorrect for outer join to + // apply the filter before hash table matching. + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Multi-Key specific declarations. + */ + + // None. + + /* + * Multi-Key Long check for repeating. + */ + + // If all BigTable input columns to key expressions are isRepeating, then + // calculate key once; lookup once. + // Also determine if any nulls are present since for a join that means no match. + boolean allKeyInputColumnsRepeating; + boolean someKeyInputColumnIsNull = false; // Only valid if allKeyInputColumnsRepeating is true. + if (bigTableKeyColumnMap.length == 0) { + allKeyInputColumnsRepeating = false; + } else { + allKeyInputColumnsRepeating = true; + for (int i = 0; i < bigTableKeyColumnMap.length; i++) { + ColumnVector colVector = batch.cols[bigTableKeyColumnMap[i]]; + if (!colVector.isRepeating) { + allKeyInputColumnsRepeating = false; + break; + } + if (!colVector.noNulls && colVector.isNull[0]) { + someKeyInputColumnIsNull = true; + } + } + } + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Multi-Key specific repeated lookup. + */ + + JoinUtil.JoinResult joinResult; + if (someKeyInputColumnIsNull) { + // Any null key column is no match for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + + // All key input columns are repeating. Generate key once. Lookup once. + keyVectorSerializeWrite.setOutput(currentKeyOutput); + keyVectorSerializeWrite.serializeWrite(batch, 0); + byte[] keyBytes = currentKeyOutput.getData(); + int keyLength = currentKeyOutput.getLength(); + joinResult = hashMap.lookup(keyBytes, 0, keyLength, hashMapResults[0]); + } + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishOuterRepeated(batch, joinResult, hashMapResults[0], scratch1); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + // For outer join we must apply the filter after match and cause some matches to become + // non-matches, we do not track non-matches here. Instead we remember all non spilled rows + // and compute non matches later in finishOuter. + int hashMapResultCount = 0; + int matchCount = 0; + int nonSpillCount = 0; + int spillCount = 0; + + /* + * Multi-Key specific variables. + */ + + Output temp; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Multi-Key outer null detection. + */ + + // Generate binary sortable key for current row in vectorized row batch. + keyVectorSerializeWrite.setOutput(currentKeyOutput); + boolean isNull = keyVectorSerializeWrite.serializeWrite(batch, batchIndex); + + if (isNull) { + + // Have that the NULL does not interfere with the current equal key series, if there + // is one. We do not set saveJoinResult. + // + // Let a current MATCH equal key series keep going, or + // Let a current SPILL equal key series keep going, or + // Let a current NOMATCH keep not matching. + + // Remember non-matches for Outer Join. + nonSpills[nonSpillCount++] = batchIndex; + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " NULL"); + } else { + + /* + * Multi-Key outer get key. + */ + + // Generated earlier to get possible null(s). + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || !saveKeyOutput.arraysEquals(currentKeyOutput)) { + + // New key. + + if (haveSaveKey) { + // Move on with our count(s). + switch (saveJoinResult) { + case MATCH: + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Multi-Key specific save key. + */ + + temp = saveKeyOutput; + saveKeyOutput = currentKeyOutput; + currentKeyOutput = temp; + + /* + * Multi-Key specific lookup key. + */ + + byte[] keyBytes = saveKeyOutput.getData(); + int keyLength = saveKeyOutput.getLength(); + saveJoinResult = hashMap.lookup(keyBytes, 0, keyLength, hashMapResults[hashMapResultCount]); + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " New Key " + saveJoinResult.name()); + } else { + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " Key Continues " + saveJoinResult.name()); + } + + /* + * Common outer join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + matchs[matchCount] = batchIndex; + matchHashMapResultIndices[matchCount] = hashMapResultCount; + matchCount++; + nonSpills[nonSpillCount++] = batchIndex; + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + nonSpills[nonSpillCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Account for last equal key sequence. + switch (saveJoinResult) { + case MATCH: + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + + " matchs " + intArrayToRangesString(matchs, matchCount) + + " matchHashMapResultIndices " + intArrayToRangesString(matchHashMapResultIndices, matchCount) + + " nonSpills " + intArrayToRangesString(nonSpills, nonSpillCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMapResults, 0, hashMapResultCount))); + } + + // We will generate results for all matching and non-matching rows. + // Note that scratch1 is undefined at this point -- it's preallocated storage. + numSel = finishOuter(batch, + matchs, matchHashMapResultIndices, matchCount, + nonSpills, nonSpillCount, + spills, spillHashMapResultIndices, spillCount, + hashMapResults, hashMapResultCount, + scratch1); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterStringOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterStringOperator.java new file mode 100644 index 0000000..5167c19 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinOuterStringOperator.java @@ -0,0 +1,368 @@ +/** + * 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.exec.vector.mapjoin; + +import java.io.IOException; +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; + +// Single-Column String hash table import. +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; + +// Single-Column String specific imports. +import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; + +/* + * Specialized class for doing a vectorized map join that is an outer join on a Single-Column String + * using a hash map. + */ +public class VectorMapJoinOuterStringOperator extends VectorMapJoinOuterGenerateResultOperator { + + private static final long serialVersionUID = 1L; + private static final Log LOG = LogFactory.getLog(VectorMapJoinOuterStringOperator.class.getName()); + private static final String CLASS_NAME = VectorMapJoinOuterStringOperator.class.getName(); + + // (none) + + // The above members are initialized by the constructor and must not be + // transient. + //--------------------------------------------------------------------------- + + // The hash map for this specialized class. + private transient VectorMapJoinBytesHashMap hashMap; + + //--------------------------------------------------------------------------- + // Single-Column String specific members. + // + + // The column number for this one column join specialization. + private transient int singleJoinColumn; + + //--------------------------------------------------------------------------- + // Pass-thru constructors. + // + + public VectorMapJoinOuterStringOperator() { + super(); + } + + public VectorMapJoinOuterStringOperator(VectorizationContext vContext, OperatorDesc conf) throws HiveException { + super(vContext, conf); + } + + //--------------------------------------------------------------------------- + // Process Single-Column String Outer Join on a vectorized row batch. + // + + @Override + public void process(Object row, int tag) throws HiveException { + + try { + VectorizedRowBatch batch = (VectorizedRowBatch) row; + + alias = (byte) tag; + + if (needCommonSetup) { + // Our one time process method initialization. + commonSetup(batch); + + /* + * Initialize Single-Column String members for this specialized class. + */ + + singleJoinColumn = bigTableKeyColumnMap[0]; + + needCommonSetup = false; + } + + if (needHashTableSetup) { + // Setup our hash table specialization. It will be the first time the process + // method is called, or after a Hybrid Grace reload. + + /* + * Get our Single-Column String hash map information for this specialized class. + */ + + hashMap = (VectorMapJoinBytesHashMap) vectorMapJoinHashTable; + + needHashTableSetup = false; + } + + batchCounter++; + + // For outer join, DO NOT apply filters yet. It is incorrect for outer join to + // apply the filter before hash table matching. + + final int inputLogicalSize = batch.size; + + if (inputLogicalSize == 0) { + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " empty"); + } + return; + } + + // Perform any key expressions. Results will go into scratch columns. + if (bigTableKeyExpressions != null) { + for (VectorExpression ve : bigTableKeyExpressions) { + ve.evaluate(batch); + } + } + + // We rebuild in-place the selected array with rows destine to be forwarded. + int numSel = 0; + + /* + * Single-Column String specific declarations. + */ + + // The one join column for this specialized class. + BytesColumnVector joinColVector = (BytesColumnVector) batch.cols[singleJoinColumn]; + byte[][] vector = joinColVector.vector; + int[] start = joinColVector.start; + int[] length = joinColVector.length; + + /* + * Single-Column String check for repeating. + */ + + // Check single column for repeating. + boolean allKeyInputColumnsRepeating = joinColVector.isRepeating; + + if (allKeyInputColumnsRepeating) { + + /* + * Repeating. + */ + + // All key input columns are repeating. Generate key once. Lookup once. + // Since the key is repeated, we must use entry 0 regardless of selectedInUse. + + /* + * Single-Column String specific repeated lookup. + */ + + JoinUtil.JoinResult joinResult; + if (!joinColVector.noNulls && joinColVector.isNull[0]) { + // Null key is no match for whole batch. + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + // Handle *repeated* join key, if found. + byte[] keyBytes = vector[0]; + int keyStart = start[0]; + int keyLength = length[0]; + joinResult = hashMap.lookup(keyBytes, keyStart, keyLength, hashMapResults[0]); + } + + /* + * Common repeated join result processing. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " repeated joinResult " + joinResult.name()); + } + numSel = finishOuterRepeated(batch, joinResult, hashMapResults[0], scratch1); + } else { + + /* + * NOT Repeating. + */ + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + " non-repeated"); + } + + int selected[] = batch.selected; + boolean selectedInUse = batch.selectedInUse; + + // For outer join we must apply the filter after match and cause some matches to become + // non-matches, we do not track non-matches here. Instead we remember all non spilled rows + // and compute non matches later in finishOuter. + int hashMapResultCount = 0; + int matchCount = 0; + int nonSpillCount = 0; + int spillCount = 0; + + /* + * Single-Column String specific variables. + */ + + int saveKeyBatchIndex = -1; + + // We optimize performance by only looking up the first key in a series of equal keys. + boolean haveSaveKey = false; + JoinUtil.JoinResult saveJoinResult = JoinUtil.JoinResult.NOMATCH; + + // Logical loop over the rows in the batch since the batch may have selected in use. + for (int logical = 0; logical < inputLogicalSize; logical++) { + int batchIndex = (selectedInUse ? selected[logical] : logical); + + /* + * Single-Column String outer null detection. + */ + + boolean isNull = !joinColVector.noNulls && joinColVector.isNull[batchIndex]; + + if (isNull) { + + // Have that the NULL does not interfere with the current equal key series, if there + // is one. We do not set saveJoinResult. + // + // Let a current MATCH equal key series keep going, or + // Let a current SPILL equal key series keep going, or + // Let a current NOMATCH keep not matching. + + // Remember non-matches for Outer Join. + nonSpills[nonSpillCount++] = batchIndex; + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " NULL"); + } else { + + /* + * Single-Column String outer get key. + */ + + // Implicit -- use batchIndex. + + /* + * Equal key series checking. + */ + + if (!haveSaveKey || + StringExpr.compare(vector[saveKeyBatchIndex], start[saveKeyBatchIndex], length[saveKeyBatchIndex], + vector[batchIndex], start[batchIndex], length[batchIndex]) != 0) { + // New key. + + if (haveSaveKey) { + // Move on with our count(s). + switch (saveJoinResult) { + case MATCH: + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + // Regardless of our matching result, we keep that information to make multiple use + // of it for a possible series of equal keys. + haveSaveKey = true; + + /* + * Single-Column String specific save key. + */ + + saveKeyBatchIndex = batchIndex; + + /* + * Single-Column Long specific lookup key. + */ + + byte[] keyBytes = vector[batchIndex]; + int keyStart = start[batchIndex]; + int keyLength = length[batchIndex]; + + saveJoinResult = hashMap.lookup(keyBytes, keyStart, keyLength, hashMapResults[hashMapResultCount]); + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " New Key " + saveJoinResult.name()); + } else { + // LOG.debug(CLASS_NAME + " logical " + logical + " batchIndex " + batchIndex + " Key Continues " + saveJoinResult.name()); + } + + /* + * Common outer join result processing. + */ + + switch (saveJoinResult) { + case MATCH: + matchs[matchCount] = batchIndex; + matchHashMapResultIndices[matchCount] = hashMapResultCount; + matchCount++; + nonSpills[nonSpillCount++] = batchIndex; + break; + + case SPILL: + spills[spillCount] = batchIndex; + spillHashMapResultIndices[spillCount] = hashMapResultCount; + spillCount++; + break; + + case NOMATCH: + nonSpills[nonSpillCount++] = batchIndex; + // VectorizedBatchUtil.debugDisplayOneRow(batch, batchIndex, CLASS_NAME + " NOMATCH duplicate"); + break; + } + } + } + + if (haveSaveKey) { + // Account for last equal key sequence. + switch (saveJoinResult) { + case MATCH: + case SPILL: + hashMapResultCount++; + break; + case NOMATCH: + break; + } + } + + if (LOG.isDebugEnabled()) { + LOG.debug(CLASS_NAME + " batch #" + batchCounter + + " matchs " + intArrayToRangesString(matchs, matchCount) + + " matchHashMapResultIndices " + intArrayToRangesString(matchHashMapResultIndices, matchCount) + + " nonSpills " + intArrayToRangesString(nonSpills, nonSpillCount) + + " spills " + intArrayToRangesString(spills, spillCount) + + " spillHashMapResultIndices " + intArrayToRangesString(spillHashMapResultIndices, spillCount) + + " hashMapResults " + Arrays.toString(Arrays.copyOfRange(hashMapResults, 0, hashMapResultCount))); + } + + // We will generate results for all matching and non-matching rows. + // Note that scratch1 is undefined at this point -- it's preallocated storage. + numSel = finishOuter(batch, + matchs, matchHashMapResultIndices, matchCount, + nonSpills, nonSpillCount, + spills, spillHashMapResultIndices, spillCount, + hashMapResults, hashMapResultCount, + scratch1); + } + + batch.selectedInUse = true; + batch.size = numSel; + + if (batch.size > 0) { + // Forward any remaining selected rows. + forwardBigTableBatch(batch); + } + + } catch (IOException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinRowBytesContainer.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinRowBytesContainer.java new file mode 100644 index 0000000..c8359d3 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/VectorMapJoinRowBytesContainer.java @@ -0,0 +1,318 @@ +/** + * 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.exec.vector.mapjoin; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.fs.FileUtil; +import org.apache.hadoop.hive.serde2.ByteStream.Output; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * An eager bytes container that puts row bytes to an output stream. + */ +public class VectorMapJoinRowBytesContainer { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinRowBytesContainer.class); + + private File parentFile; + private File tmpFile; + + // We buffer in a org.apache.hadoop.hive.serde2.ByteStream.Output since that is what + // is used by VectorSerializeRow / SerializeWrite. Periodically, we flush this buffer + // to disk. + private Output output; + private int rowBeginPos; + private static final int OUTPUT_SIZE = 4096; + private static final int THRESHOLD = 8 * (OUTPUT_SIZE / 10); + private static final int INPUT_SIZE = 4096; + + private FileOutputStream fileOutputStream; + + private boolean isOpen; + + private byte[] readBuffer; + private byte[] largeRowBuffer; + private int readOffset; + private int readLength; + + private int readNextCount; + private int readNextIndex; + + private static final int MAX_READS = 256; + private byte[][] readNextBytes; + private int readNextOffsets[]; + private int readNextLengths[]; + + private byte[] currentBytes; + private int currentOffset; + private int currentLength; + + private long totalWriteLength; + private long totalReadLength; + + private FileInputStream fileInputStream; + + public VectorMapJoinRowBytesContainer() { + output = new Output(); + readBuffer = new byte[INPUT_SIZE]; + readNextBytes = new byte[MAX_READS][]; + readNextOffsets = new int[MAX_READS]; + readNextLengths = new int[MAX_READS]; + isOpen = false; + totalWriteLength = 0; + totalReadLength = 0; + } + + private void setupOutputFileStreams() throws IOException { + + parentFile = File.createTempFile("bytes-container", ""); + if (parentFile.delete() && parentFile.mkdir()) { + parentFile.deleteOnExit(); + } + + tmpFile = File.createTempFile("BytesContainer", ".tmp", parentFile); + LOG.info("BytesContainer created temp file " + tmpFile.getAbsolutePath()); + tmpFile.deleteOnExit(); + + fileOutputStream = new FileOutputStream(tmpFile); + } + + private void initFile() { + try { + setupOutputFileStreams(); + } catch (IOException e) { + throw new RuntimeException("Failed to create temporary output file on disk", e); + } + } + + public Output getOuputForRowBytes() { + if (!isOpen) { + initFile(); + isOpen = true; + } + // Reserve space for the int length. + output.reserve(4); + rowBeginPos = output.getLength(); + return output; + } + + public void finishRow() throws IOException { + int length = output.getLength() - rowBeginPos; + output.writeInt(rowBeginPos - 4, length); + if (output.getLength() > THRESHOLD) { + fileOutputStream.write(output.getData(), 0, output.getLength()); + totalWriteLength += output.getLength(); + output.reset(); + } + } + + public void prepareForReading() throws IOException { + if (!isOpen) { + return; + } + if (output.getLength() > 0) { + fileOutputStream.write(output.getData(), 0, output.getLength()); + totalWriteLength += output.getLength(); + fileOutputStream.flush(); + output.reset(); + } + if (fileInputStream != null) { + fileInputStream.close(); + } + fileInputStream = new FileInputStream(tmpFile); + readNextIndex = 0; + readNextCount = 0; + } + + private int readInt() { + int value = (((readBuffer[readOffset] & 0xFF) << 24) | + ((readBuffer[readOffset + 1] & 0xFF) << 16) | + ((readBuffer[readOffset + 2] & 0xFF) << 8) | + ((readBuffer[readOffset + 3] & 0xFF))); + readOffset += 4; + return value; + } + + // Call when nextReadIndex == nextReadCount. + private void bufferedRead() throws IOException { + + // Reset for reading. + readNextIndex = 0; + + // Reset for filling. + readNextCount = 0; + + if (readOffset < readLength) { + // Move unprocessed remainder to beginning of buffer. + int unprocessLength = readLength - readOffset; + System.arraycopy(readBuffer, readOffset, readBuffer, 0, unprocessLength); + + int maxReadLength = readBuffer.length - unprocessLength; + int partialReadLength = fileInputStream.read(readBuffer, unprocessLength, maxReadLength); + if (partialReadLength == -1) { + partialReadLength = 0; + } + totalReadLength += partialReadLength; + readLength = unprocessLength + partialReadLength; + readOffset = 0; + } else { + readOffset = 0; + readLength = fileInputStream.read(readBuffer, 0, readBuffer.length); + if (readLength == -1) { + readLength = 0; + } + totalReadLength += readLength; + } + if (readLength == 0) { + return; + } + if (readLength < 0) { + throw new IOException("Negative read length"); + } + + // Get length word. + if (readLength < 4) { + throw new IOException("Expecting 4 byte length"); + } + + while (true) { + // Use Input class to read length. + int saveReadOffset = readOffset; + int rowLength = readInt(); + if (rowLength < 0) { + throw new IOException("Negative row length"); + } + int remainingLength = readLength - readOffset; + if (remainingLength < rowLength) { + if (readNextCount > 0) { + // Leave this one for the next round. + readOffset = saveReadOffset; + break; + } + + // Buffer needed to bridge. + if (largeRowBuffer == null || largeRowBuffer.length < rowLength) { + int newLargeBufferLength = Math.max(Integer.highestOneBit(rowLength) << 1, INPUT_SIZE); + largeRowBuffer = new byte[newLargeBufferLength]; + } + System.arraycopy(readBuffer, readOffset, largeRowBuffer, 0, remainingLength); + int expectedPartialLength = rowLength - remainingLength; + int partialReadLength = fileInputStream.read(largeRowBuffer, remainingLength, expectedPartialLength); + if (partialReadLength == -1) { + throw new IOException("Unexpected EOF (total write length " + totalWriteLength + + ", total read length " + totalReadLength + ", read length " + + expectedPartialLength + ")"); + } + + if (expectedPartialLength != partialReadLength) { + throw new IOException("Unable to read a complete row of length " + rowLength + + " (total write length " + totalWriteLength + + ", total read length " + totalReadLength + ", read length " + + expectedPartialLength + ", actual length " + partialReadLength + ")"); + } + totalReadLength += partialReadLength; + + readNextBytes[readNextCount] = largeRowBuffer; + readNextOffsets[readNextCount] = 0; + readNextLengths[readNextCount] = rowLength; + + // Indicate we used the last row's bytes for large buffer. + readOffset = readLength; + readNextCount++; + break; + } + + readNextBytes[readNextCount] = readBuffer; + readNextOffsets[readNextCount] = readOffset; + readNextLengths[readNextCount] = rowLength; + readOffset += rowLength; + readNextCount++; + + if (readNextCount >= readNextBytes.length){ + break; + } + if (readLength - readOffset < 4) { + // Handle in next round. + break; + } + } + } + + public boolean readNext() throws IOException { + if (!isOpen) { + return false; + } + if (readNextIndex >= readNextCount) { + bufferedRead(); + // Any more left? + if (readNextIndex >= readNextCount) { + return false; + } + } + + currentBytes = readNextBytes[readNextIndex]; + currentOffset = readNextOffsets[readNextIndex]; + currentLength = readNextLengths[readNextIndex]; + + readNextIndex++; + return true; + } + + public byte[] currentBytes() { + return currentBytes; + } + + public int currentOffset() { + return currentOffset; + } + + public int currentLength() { + return currentLength; + } + + public void clear() throws IOException { + if (fileInputStream != null) { + try { + fileInputStream.close(); + } catch (Throwable ignored) { + } + fileInputStream = null; + } + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (Throwable ignored) { + } + fileOutputStream = null; + } + try { + FileUtil.fullyDelete(parentFile); + } catch (Throwable ignored) { + } + parentFile = null; + tmpFile = null; + isOpen = false; + totalWriteLength = 0; + } + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashMap.java new file mode 100644 index 0000000..0796406 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashMap.java @@ -0,0 +1,101 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash map optimized for vector map join. + */ +public abstract class VectorMapJoinFastBytesHashMap + extends VectorMapJoinFastBytesHashTable + implements VectorMapJoinBytesHashMap { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastBytesHashMap.class); + + private VectorMapJoinFastValueStore valueStore; + + @Override + public VectorMapJoinHashMapResult createHashMapResult() { + return new VectorMapJoinFastValueStore.HashMapResult(); + } + + @Override + public void assignSlot(int slot, byte[] keyBytes, int keyStart, int keyLength, + long hashCode, boolean isNewKey, BytesWritable currentValue) { + + byte[] valueBytes = currentValue.getBytes(); + int valueLength = currentValue.getLength(); + + int tripleIndex = 3 * slot; + if (isNewKey) { + // First entry. + slotTriples[tripleIndex] = keyStore.add(keyBytes, keyStart, keyLength); + slotTriples[tripleIndex + 1] = hashCode; + slotTriples[tripleIndex + 2] = valueStore.addFirst(valueBytes, 0, valueLength); + // LOG.info("VectorMapJoinFastBytesHashMap add first keyRefWord " + Long.toHexString(slotTriples[tripleIndex]) + " hashCode " + Long.toHexString(slotTriples[tripleIndex + 1]) + " valueRefWord " + Long.toHexString(slotTriples[tripleIndex + 2])); + keysAssigned++; + } else { + // Add another value. + // LOG.info("VectorMapJoinFastBytesHashMap add more keyRefWord " + Long.toHexString(slotTriples[tripleIndex]) + " hashCode " + Long.toHexString(slotTriples[tripleIndex + 1]) + " valueRefWord " + Long.toHexString(slotTriples[tripleIndex + 2])); + slotTriples[tripleIndex + 2] = valueStore.addMore(slotTriples[tripleIndex + 2], valueBytes, 0, valueLength); + // LOG.info("VectorMapJoinFastBytesHashMap add more new valueRefWord " + Long.toHexString(slotTriples[tripleIndex + 2])); + } + } + + @Override + public JoinUtil.JoinResult lookup(byte[] keyBytes, int keyStart, int keyLength, VectorMapJoinHashMapResult hashMapResult) { + VectorMapJoinFastValueStore.HashMapResult optimizedHashMapResult = + (VectorMapJoinFastValueStore.HashMapResult) hashMapResult; + + optimizedHashMapResult.forget(); + + long hashCode = VectorMapJoinFastBytesHashUtil.hashKey(keyBytes, keyStart, keyLength); + long valueRefWord = findReadSlot(keyBytes, keyStart, keyLength, hashCode); + JoinUtil.JoinResult joinResult; + if (valueRefWord == -1) { + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + // LOG.info("VectorMapJoinFastBytesHashMap lookup hashCode " + Long.toHexString(hashCode) + " valueRefWord " + Long.toHexString(valueRefWord) + " (valueStore != null) " + (valueStore != null)); + + optimizedHashMapResult.set(valueStore, valueRefWord); + + joinResult = JoinUtil.JoinResult.MATCH; + } + + optimizedHashMapResult.setJoinResult(joinResult); + + return joinResult; + } + + public VectorMapJoinFastBytesHashMap( + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + + valueStore = new VectorMapJoinFastValueStore(writeBuffersSize); + + // Share the same write buffers with our value store. + keyStore = new VectorMapJoinFastKeyStore(valueStore.writeBuffers()); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashMultiSet.java new file mode 100644 index 0000000..d685c22 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashMultiSet.java @@ -0,0 +1,93 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMultiSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash multi-set optimized for vector map join. + */ +public abstract class VectorMapJoinFastBytesHashMultiSet + extends VectorMapJoinFastBytesHashTable + implements VectorMapJoinBytesHashMultiSet { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastBytesHashMultiSet.class); + + @Override + public VectorMapJoinHashMultiSetResult createHashMultiSetResult() { + return new VectorMapJoinFastHashMultiSet.HashMultiSetResult(); + } + + @Override + public void assignSlot(int slot, byte[] keyBytes, int keyStart, int keyLength, + long hashCode, boolean isNewKey, BytesWritable currentValue) { + + int tripleIndex = 3 * slot; + if (isNewKey) { + // First entry. + slotTriples[tripleIndex] = keyStore.add(keyBytes, keyStart, keyLength); + slotTriples[tripleIndex + 1] = hashCode; + slotTriples[tripleIndex + 2] = 1; // Count. + // LOG.info("VectorMapJoinFastBytesHashMap add first keyRefWord " + Long.toHexString(slotTriples[tripleIndex]) + " hashCode " + Long.toHexString(slotTriples[tripleIndex + 1]) + " valueRefWord " + Long.toHexString(slotTriples[tripleIndex + 2])); + keysAssigned++; + } else { + // Add another value. + // LOG.info("VectorMapJoinFastBytesHashMap add more keyRefWord " + Long.toHexString(slotTriples[tripleIndex]) + " hashCode " + Long.toHexString(slotTriples[tripleIndex + 1]) + " valueRefWord " + Long.toHexString(slotTriples[tripleIndex + 2])); + slotTriples[tripleIndex + 2]++; + } + } + + @Override + public JoinUtil.JoinResult contains(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashMultiSetResult hashMultiSetResult) { + + VectorMapJoinFastHashMultiSet.HashMultiSetResult optimizedHashMultiSetResult = + (VectorMapJoinFastHashMultiSet.HashMultiSetResult) hashMultiSetResult; + + optimizedHashMultiSetResult.forget(); + + long hashCode = VectorMapJoinFastBytesHashUtil.hashKey(keyBytes, keyStart, keyLength); + long count = findReadSlot(keyBytes, keyStart, keyLength, hashCode); + JoinUtil.JoinResult joinResult; + if (count == -1) { + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + + optimizedHashMultiSetResult.set(count); + + joinResult = JoinUtil.JoinResult.MATCH; + } + + optimizedHashMultiSetResult.setJoinResult(joinResult); + + return joinResult; + } + + public VectorMapJoinFastBytesHashMultiSet( + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + + keyStore = new VectorMapJoinFastKeyStore(writeBuffersSize); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashSet.java new file mode 100644 index 0000000..9f20fdc --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashSet.java @@ -0,0 +1,85 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash multi-set optimized for vector map join. + */ +public abstract class VectorMapJoinFastBytesHashSet + extends VectorMapJoinFastBytesHashTable + implements VectorMapJoinBytesHashSet { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastBytesHashSet.class); + + @Override + public VectorMapJoinHashSetResult createHashSetResult() { + return new VectorMapJoinFastHashSet.HashSetResult(); + } + + @Override + public void assignSlot(int slot, byte[] keyBytes, int keyStart, int keyLength, + long hashCode, boolean isNewKey, BytesWritable currentValue) { + + int tripleIndex = 3 * slot; + if (isNewKey) { + // First entry. + slotTriples[tripleIndex] = keyStore.add(keyBytes, keyStart, keyLength); + slotTriples[tripleIndex + 1] = hashCode; + slotTriples[tripleIndex + 2] = 1; // Existence + keysAssigned++; + } + } + + @Override + public JoinUtil.JoinResult contains(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashSetResult hashSetResult) { + + VectorMapJoinFastHashSet.HashSetResult optimizedHashSetResult = + (VectorMapJoinFastHashSet.HashSetResult) hashSetResult; + + optimizedHashSetResult.forget(); + + long hashCode = VectorMapJoinFastBytesHashUtil.hashKey(keyBytes, keyStart, keyLength); + long existance = findReadSlot(keyBytes, keyStart, keyLength, hashCode); + JoinUtil.JoinResult joinResult; + if (existance == -1) { + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + joinResult = JoinUtil.JoinResult.MATCH; + } + + optimizedHashSetResult.setJoinResult(joinResult); + + return joinResult; + } + + public VectorMapJoinFastBytesHashSet( + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + + keyStore = new VectorMapJoinFastKeyStore(writeBuffersSize); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashTable.java new file mode 100644 index 0000000..594a77f --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashTable.java @@ -0,0 +1,221 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashTable; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.io.BytesWritable; + +import com.google.common.annotations.VisibleForTesting; + +/* + * An single byte array value hash map optimized for vector map join. + */ +public abstract class VectorMapJoinFastBytesHashTable + extends VectorMapJoinFastHashTable + implements VectorMapJoinBytesHashTable { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastBytesHashTable.class); + + protected VectorMapJoinFastKeyStore keyStore; + + private BytesWritable testKeyBytesWritable; + private BytesWritable testValueBytesWritable; + + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) throws HiveException, IOException { + // No deserialization of key(s) here -- just get reference to bytes. + byte[] keyBytes = currentKey.getBytes(); + int keyLength = currentKey.getLength(); + add(keyBytes, 0, keyLength, currentValue); + } + + @VisibleForTesting + public void putRow(byte[] currentKey, byte[] currentValue) throws HiveException, IOException { + if (testKeyBytesWritable == null) { + testKeyBytesWritable = new BytesWritable(); + testValueBytesWritable = new BytesWritable(); + } + testKeyBytesWritable.set(currentKey, 0, currentKey.length); + testValueBytesWritable.set(currentValue, 0, currentValue.length); + putRow(testKeyBytesWritable, testValueBytesWritable); + } + + protected abstract void assignSlot(int slot, byte[] keyBytes, int keyStart, int keyLength, + long hashCode, boolean isNewKey, BytesWritable currentValue); + + public void add(byte[] keyBytes, int keyStart, int keyLength, BytesWritable currentValue) { + + if (resizeThreshold <= keysAssigned) { + expandAndRehash(); + } + + long hashCode = VectorMapJoinFastBytesHashUtil.hashKey(keyBytes, keyStart, keyLength); + int intHashCode = (int) hashCode; + int slot = (intHashCode & logicalHashBucketMask); + long probeSlot = slot; + int i = 0; + boolean isNewKey; + while (true) { + int tripleIndex = 3 * slot; + if (slotTriples[tripleIndex] == 0) { + // LOG.info("VectorMapJoinFastBytesHashMap findWriteSlot slot " + slot + " tripleIndex " + tripleIndex + " empty"); + isNewKey = true;; + break; + } + if (hashCode == slotTriples[tripleIndex + 1] && + keyStore.equalKey(slotTriples[tripleIndex], keyBytes, keyStart, keyLength)) { + // LOG.info("VectorMapJoinFastBytesHashMap findWriteSlot slot " + slot + " tripleIndex " + tripleIndex + " existing"); + isNewKey = false; + break; + } + // TODO + ++metricPutConflict; + // Some other key (collision) - keep probing. + probeSlot += (++i); + slot = (int) (probeSlot & logicalHashBucketMask); + } + + if (largestNumberOfSteps < i) { + if (LOG.isDebugEnabled()) { + LOG.debug("Probed " + i + " slots (the longest so far) to find space"); + } + largestNumberOfSteps = i; + // debugDumpKeyProbe(keyOffset, keyLength, hashCode, slot); + } + + assignSlot(slot, keyBytes, keyStart, keyLength, hashCode, isNewKey, currentValue); + + if (isNewKey) { + keysAssigned++; + } + } + + private void expandAndRehash() { + + int newLogicalHashBucketCount = logicalHashBucketCount * 2; + int newLogicalHashBucketMask = newLogicalHashBucketCount - 1; + int newMetricPutConflict = 0; + int newLargestNumberOfSteps = 0; + + int newSlotTripleArraySize = newLogicalHashBucketCount * 3; + long[] newSlotTriples = new long[newSlotTripleArraySize]; + + for (int slot = 0; slot < logicalHashBucketCount; slot++) { + int tripleIndex = slot * 3; + long keyRef = slotTriples[tripleIndex]; + if (keyRef != 0) { + long hashCode = slotTriples[tripleIndex + 1]; + long valueRef = slotTriples[tripleIndex + 2]; + + // Copy to new slot table. + int intHashCode = (int) hashCode; + int newSlot = intHashCode & newLogicalHashBucketMask; + long newProbeSlot = newSlot; + int newTripleIndex; + int i = 0; + while (true) { + newTripleIndex = newSlot * 3; + long newKeyRef = newSlotTriples[newTripleIndex]; + if (newKeyRef == 0) { + break; + } + ++newMetricPutConflict; + // Some other key (collision) - keep probing. + newProbeSlot += (++i); + newSlot = (int)(newProbeSlot & newLogicalHashBucketMask); + } + + if (newLargestNumberOfSteps < i) { + if (LOG.isDebugEnabled()) { + LOG.debug("Probed " + i + " slots (the longest so far) to find space"); + } + newLargestNumberOfSteps = i; + // debugDumpKeyProbe(keyOffset, keyLength, hashCode, slot); + } + + // Use old value reference word. + // LOG.info("VectorMapJoinFastLongHashTable expandAndRehash key " + tableKey + " slot " + newSlot + " newPairIndex " + newPairIndex + " empty slot (i = " + i + ")"); + + newSlotTriples[newTripleIndex] = keyRef; + newSlotTriples[newTripleIndex + 1] = hashCode; + newSlotTriples[newTripleIndex + 2] = valueRef; + } + } + + slotTriples = newSlotTriples; + logicalHashBucketCount = newLogicalHashBucketCount; + logicalHashBucketMask = newLogicalHashBucketMask; + metricPutConflict = newMetricPutConflict; + largestNumberOfSteps = newLargestNumberOfSteps; + resizeThreshold = (int)(logicalHashBucketCount * loadFactor); + metricExpands++; + // LOG.info("VectorMapJoinFastLongHashTable expandAndRehash new logicalHashBucketCount " + logicalHashBucketCount + " resizeThreshold " + resizeThreshold + " metricExpands " + metricExpands); + } + + protected long findReadSlot(byte[] keyBytes, int keyStart, int keyLength, long hashCode) { + + int intHashCode = (int) hashCode; + int slot = (intHashCode & logicalHashBucketMask); + long probeSlot = slot; + int i = 0; + while (true) { + int tripleIndex = slot * 3; + // LOG.info("VectorMapJoinFastBytesHashMap findReadSlot slot keyRefWord " + Long.toHexString(slotTriples[tripleIndex]) + " hashCode " + Long.toHexString(hashCode) + " entry hashCode " + Long.toHexString(slotTriples[tripleIndex + 1]) + " valueRefWord " + Long.toHexString(slotTriples[tripleIndex + 2])); + if (slotTriples[tripleIndex] != 0 && hashCode == slotTriples[tripleIndex + 1]) { + // Finally, verify the key bytes match. + + if (keyStore.equalKey(slotTriples[tripleIndex], keyBytes, keyStart, keyLength)) { + return slotTriples[tripleIndex + 2]; + } + } + // Some other key (collision) - keep probing. + probeSlot += (++i); + if (i > largestNumberOfSteps) { + // We know we never went that far when we were inserting. + return -1; + } + slot = (int)(probeSlot & logicalHashBucketMask); + } + } + + /* + * The hash table slots. For a bytes key hash table, each slot is 3 longs and the array is + * 3X sized. + * + * The slot triple is 1) a non-zero reference word to the key bytes, 2) the key hash code, and + * 3) a non-zero reference word to the first value bytes. + */ + protected long[] slotTriples; + + private void allocateBucketArray() { + int slotTripleArraySize = 3 * logicalHashBucketCount; + slotTriples = new long[slotTripleArraySize]; + } + + public VectorMapJoinFastBytesHashTable( + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + allocateBucketArray(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashUtil.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashUtil.java new file mode 100644 index 0000000..28f7357 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastBytesHashUtil.java @@ -0,0 +1,41 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.hadoop.hive.serde2.WriteBuffers; + +public class VectorMapJoinFastBytesHashUtil { + + public static long hashKey(byte[] bytes, int start, int length) { + return WriteBuffers.murmurHash(bytes, start, length); + } + + public static String displayBytes(byte[] bytes, int start, int length) { + StringBuilder sb = new StringBuilder(); + for (int i = start; i < start + length; i++) { + char ch = (char) bytes[i]; + if (ch < ' ' || ch > '~') { + sb.append(String.format("\\%03d", (int) (bytes[i] & 0xff))); + } else { + sb.append(ch); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashMap.java new file mode 100644 index 0000000..b37247c --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashMap.java @@ -0,0 +1,38 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; + +public abstract class VectorMapJoinFastHashMap + extends VectorMapJoinFastHashTable + implements VectorMapJoinHashMap { + + @Override + public VectorMapJoinHashMapResult createHashMapResult() { + return new VectorMapJoinFastValueStore.HashMapResult(); + } + + public VectorMapJoinFastHashMap( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashMultiSet.java new file mode 100644 index 0000000..5569f6e --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashMultiSet.java @@ -0,0 +1,48 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; + +public abstract class VectorMapJoinFastHashMultiSet + extends VectorMapJoinFastHashTable implements VectorMapJoinHashMultiSet { + + @Override + public VectorMapJoinHashMultiSetResult createHashMultiSetResult() { + return new HashMultiSetResult(); + } + + public static class HashMultiSetResult extends VectorMapJoinHashMultiSetResult { + + HashMultiSetResult() { + super(); + } + + public void set(long count) { + this.count = count; + } + } + + public VectorMapJoinFastHashMultiSet( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashSet.java new file mode 100644 index 0000000..0738df3 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashSet.java @@ -0,0 +1,44 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; + +public abstract class VectorMapJoinFastHashSet + extends VectorMapJoinFastHashTable implements VectorMapJoinHashSet { + + @Override + public VectorMapJoinHashSetResult createHashSetResult() { + return new HashSetResult(); + } + + public static class HashSetResult extends VectorMapJoinHashSetResult { + + HashSetResult() { + super(); + } + } + + public VectorMapJoinFastHashSet( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashTable.java new file mode 100644 index 0000000..33e34fa --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashTable.java @@ -0,0 +1,70 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTable; + +public abstract class VectorMapJoinFastHashTable implements VectorMapJoinHashTable { + public static final Log LOG = LogFactory.getLog(VectorMapJoinFastHashTable.class); + + protected int logicalHashBucketCount; + protected int logicalHashBucketMask; + + protected float loadFactor; + protected int writeBuffersSize; + protected long memUsage; + + protected int metricPutConflict; + protected int largestNumberOfSteps; + protected int keysAssigned; + protected int resizeThreshold; + protected int metricExpands; + + private static void validateCapacity(long capacity) { + if (Long.bitCount(capacity) != 1) { + throw new AssertionError("Capacity must be a power of two"); + } + if (capacity <= 0) { + throw new AssertionError("Invalid capacity " + capacity); + } + } + + private static int nextHighestPowerOfTwo(int v) { + return Integer.highestOneBit(v) << 1; + } + + public VectorMapJoinFastHashTable( + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + + initialCapacity = (Long.bitCount(initialCapacity) == 1) + ? initialCapacity : nextHighestPowerOfTwo(initialCapacity); + + validateCapacity(initialCapacity); + + logicalHashBucketCount = initialCapacity; + logicalHashBucketMask = logicalHashBucketCount - 1; + resizeThreshold = (int)(logicalHashBucketCount * loadFactor); + + this.loadFactor = loadFactor; + this.writeBuffersSize = writeBuffersSize; + this.memUsage = memUsage; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashTableLoader.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashTableLoader.java new file mode 100644 index 0000000..e83ee8b --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastHashTableLoader.java @@ -0,0 +1,111 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.ql.exec.MapJoinOperator; +import org.apache.hadoop.hive.ql.exec.MapredContext; +import org.apache.hadoop.hive.ql.exec.mr.ExecMapperContext; +import org.apache.hadoop.hive.ql.exec.persistence.HashMapWrapper; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainerSerDe; +import org.apache.hadoop.hive.ql.exec.tez.TezContext; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.MapJoinDesc; +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.tez.runtime.api.Input; +import org.apache.tez.runtime.api.LogicalInput; +import org.apache.tez.runtime.library.api.KeyValueReader; + +/** + * HashTableLoader for Tez constructs the hashtable from records read from + * a broadcast edge. + */ +public class VectorMapJoinFastHashTableLoader implements org.apache.hadoop.hive.ql.exec.HashTableLoader { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastHashTableLoader.class.getName()); + + private Configuration hconf; + protected MapJoinDesc desc; + private TezContext tezContext; + + @Override + public void init(ExecMapperContext context, MapredContext mrContext, + Configuration hconf, MapJoinOperator joinOp) { + this.tezContext = (TezContext) mrContext; + this.hconf = hconf; + this.desc = joinOp.getConf(); + } + + @Override + public void load(MapJoinTableContainer[] mapJoinTables, + MapJoinTableContainerSerDe[] mapJoinTableSerdes, long memUsage) + throws HiveException { + + Map parentToInput = desc.getParentToInput(); + Map parentKeyCounts = desc.getParentKeyCounts(); + + for (int pos = 0; pos < mapJoinTables.length; pos++) { + if (pos == desc.getPosBigTable()) { + continue; + } + + String inputName = parentToInput.get(pos); + LogicalInput input = tezContext.getInput(inputName); + + try { + input.start(); + tezContext.getTezProcessorContext().waitForAnyInputReady( + Collections. singletonList(input)); + } catch (Exception e) { + throw new HiveException(e); + } + + try { + KeyValueReader kvReader = (KeyValueReader) input.getReader(); + + Long keyCountObj = parentKeyCounts.get(pos); + long keyCount = (keyCountObj == null) ? -1 : keyCountObj.longValue(); + + VectorMapJoinFastTableContainer VectorMapJoinFastTableContainer = + new VectorMapJoinFastTableContainer(desc, hconf, keyCount, memUsage); + + while (kvReader.next()) { + VectorMapJoinFastTableContainer.putRow(kvReader); + } + + VectorMapJoinFastTableContainer.seal(); + mapJoinTables[pos] = (MapJoinTableContainer) VectorMapJoinFastTableContainer; + + } catch (IOException e) { + throw new HiveException(e); + } catch (SerDeException e) { + throw new HiveException(e); + } catch (Exception e) { + throw new HiveException(e); + } + } + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastIntHashUtil.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastIntHashUtil.java new file mode 100644 index 0000000..a818cb2 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastIntHashUtil.java @@ -0,0 +1,32 @@ +/** + * 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.exec.vector.mapjoin.fast; + +public class VectorMapJoinFastIntHashUtil { + + public static int hashKey(int key) { + key = ~key + (key << 15); // key = (key << 15) - key - 1; + key = key ^ (key >>> 12); + key = key + (key << 2); + key = key ^ (key >>> 4); + key = key * 2057; // key = (key + (key << 3)) + (key << 11); + key = key ^ (key >>> 16); + return key; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastKeyStore.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastKeyStore.java new file mode 100644 index 0000000..8655e10 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastKeyStore.java @@ -0,0 +1,135 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.serde2.WriteBuffers; + +// Optimized for sequential key lookup. + +public class VectorMapJoinFastKeyStore { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastKeyStore.class.getName()); + + private WriteBuffers writeBuffers; + + private WriteBuffers.ByteSegmentRef byteSegmentRef; + private WriteBuffers.Position readPos; + + // Lowest field. + private final class AbsoluteKeyOffset { + private static final int bitLength = 40; + private static final long allBitsOn = (((long) 1) << bitLength) - 1; + private static final long bitMask = allBitsOn; + + // Make it a power of 2 by backing down (i.e. the -2). + private static final long maxSize = ((long) 1) << (bitLength - 2); + } + + private final class SmallKeyLength { + private static final int bitLength = 20; + private static final int allBitsOn = (1 << bitLength) - 1; + private static final int threshold = allBitsOn; // Lower this for big key testing. + private static final int bitShift = AbsoluteKeyOffset.bitLength; + private static final long bitMask = ((long) allBitsOn) << bitShift; + } + + private final class IsNonZeroFlag { + private static final int bitShift = SmallKeyLength.bitShift + SmallKeyLength.bitLength;; + private static final long flagOnMask = ((long) 1) << bitShift; + } + + public long add(byte[] keyBytes, int keyStart, int keyLength) { + boolean isKeyLengthBig = (keyLength >= SmallKeyLength.threshold); + + long absoluteKeyOffset = writeBuffers.getWritePoint(); + if (isKeyLengthBig) { + writeBuffers.writeVInt(keyLength); + } + writeBuffers.write(keyBytes, keyStart, keyLength); + + // TODO: Make this more sophisticated. + long keyRefWord = IsNonZeroFlag.flagOnMask; + if (isKeyLengthBig) { + keyRefWord |= ((long) SmallKeyLength.allBitsOn) << SmallKeyLength.bitShift; + } else { + keyRefWord |= ((long) keyLength) << SmallKeyLength.bitShift; + } + keyRefWord |= absoluteKeyOffset; + + // LOG.info("VectorMapJoinFastKeyStore add keyLength " + keyLength + " absoluteKeyOffset " + absoluteKeyOffset + " keyRefWord " + Long.toHexString(keyRefWord)); + return keyRefWord; + } + + public boolean equalKey(long keyRefWord, byte[] keyBytes, int keyStart, int keyLength) { + + int storedKeyLengthLength = + (int) ((keyRefWord & SmallKeyLength.bitMask) >> SmallKeyLength.bitShift); + boolean isKeyLengthSmall = (storedKeyLengthLength != SmallKeyLength.allBitsOn); + + // LOG.info("VectorMapJoinFastKeyStore equalKey keyLength " + keyLength + " isKeyLengthSmall " + isKeyLengthSmall + " storedKeyLengthLength " + storedKeyLengthLength + " keyRefWord " + Long.toHexString(keyRefWord)); + + if (isKeyLengthSmall && storedKeyLengthLength != keyLength) { + return false; + } + long absoluteKeyOffset = + (keyRefWord & AbsoluteKeyOffset.bitMask); + + writeBuffers.setReadPoint(absoluteKeyOffset, readPos); + if (!isKeyLengthSmall) { + // Read big value length we wrote with the value. + storedKeyLengthLength = writeBuffers.readVInt(readPos); + if (storedKeyLengthLength != keyLength) { + // LOG.info("VectorMapJoinFastKeyStore equalKey no match big length"); + return false; + } + } + + // Our reading is positioned to the key. + writeBuffers.getByteSegmentRefToCurrent(byteSegmentRef, keyLength, readPos); + + byte[] currentBytes = byteSegmentRef.getBytes(); + int currentStart = (int) byteSegmentRef.getOffset(); + + for (int i = 0; i < keyLength; i++) { + if (currentBytes[currentStart + i] != keyBytes[keyStart + i]) { + // LOG.info("VectorMapJoinFastKeyStore equalKey no match on bytes"); + return false; + } + } + // LOG.info("VectorMapJoinFastKeyStore equalKey match on bytes"); + return true; + } + + public VectorMapJoinFastKeyStore(int writeBuffersSize) { + writeBuffers = new WriteBuffers(writeBuffersSize, AbsoluteKeyOffset.maxSize); + + byteSegmentRef = new WriteBuffers.ByteSegmentRef(); + readPos = new WriteBuffers.Position(); + } + + public VectorMapJoinFastKeyStore(WriteBuffers writeBuffers) { + // TODO: Check if maximum size compatible with AbsoluteKeyOffset.maxSize. + this.writeBuffers = writeBuffers; + + byteSegmentRef = new WriteBuffers.ByteSegmentRef(); + readPos = new WriteBuffers.Position(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashMap.java new file mode 100644 index 0000000..3a0b380 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashMap.java @@ -0,0 +1,94 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMap; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single long value map optimized for vector map join. + */ +public class VectorMapJoinFastLongHashMap + extends VectorMapJoinFastLongHashTable + implements VectorMapJoinLongHashMap { + + public static final Log LOG = LogFactory.getLog(VectorMapJoinFastLongHashMap.class); + + protected VectorMapJoinFastValueStore valueStore; + + @Override + public VectorMapJoinHashMapResult createHashMapResult() { + return new VectorMapJoinFastValueStore.HashMapResult(); + } + + @Override + public void assignSlot(int slot, long key, boolean isNewKey, BytesWritable currentValue) { + + byte[] valueBytes = currentValue.getBytes(); + int valueLength = currentValue.getLength(); + + int pairIndex = 2 * slot; + if (isNewKey) { + // First entry. + slotPairs[pairIndex] = valueStore.addFirst(valueBytes, 0, valueLength); + slotPairs[pairIndex + 1] = key; + } else { + // Add another value. + slotPairs[pairIndex] = valueStore.addMore(slotPairs[pairIndex], valueBytes, 0, valueLength); + } + } + + @Override + public JoinUtil.JoinResult lookup(long key, VectorMapJoinHashMapResult hashMapResult) { + + VectorMapJoinFastValueStore.HashMapResult optimizedHashMapResult = + (VectorMapJoinFastValueStore.HashMapResult) hashMapResult; + + optimizedHashMapResult.forget(); + + long hashCode = VectorMapJoinFastLongHashUtil.hashKey(key); + // LOG.info("VectorMapJoinFastLongHashMap lookup " + key + " hashCode " + hashCode); + long valueRef = findReadSlot(key, hashCode); + JoinUtil.JoinResult joinResult; + if (valueRef == -1) { + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + optimizedHashMapResult.set(valueStore, valueRef); + + joinResult = JoinUtil.JoinResult.MATCH; + } + + optimizedHashMapResult.setJoinResult(joinResult); + + return joinResult; + } + + public VectorMapJoinFastLongHashMap( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(minMaxEnabled, isOuterJoin, hashTableKeyType, + initialCapacity, loadFactor, writeBuffersSize, memUsage); + valueStore = new VectorMapJoinFastValueStore(writeBuffersSize); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashMultiSet.java new file mode 100644 index 0000000..f9763e3 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashMultiSet.java @@ -0,0 +1,91 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMultiSet; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single long value multi-set optimized for vector map join. + */ +public class VectorMapJoinFastLongHashMultiSet + extends VectorMapJoinFastLongHashTable + implements VectorMapJoinLongHashMultiSet { + + public static final Log LOG = LogFactory.getLog(VectorMapJoinFastLongHashMultiSet.class); + + @Override + public VectorMapJoinHashMultiSetResult createHashMultiSetResult() { + return new VectorMapJoinFastHashMultiSet.HashMultiSetResult(); + } + + @Override + public void assignSlot(int slot, long key, boolean isNewKey, BytesWritable currentValue) { + + int pairIndex = 2 * slot; + if (isNewKey) { + // First entry. + slotPairs[pairIndex] = 1; // Count. + slotPairs[pairIndex + 1] = key; + } else { + // Add another value. + slotPairs[pairIndex]++; + } + } + + + @Override + public JoinUtil.JoinResult contains(long key, VectorMapJoinHashMultiSetResult hashMultiSetResult) { + + VectorMapJoinFastHashMultiSet.HashMultiSetResult optimizedHashMultiSetResult = + (VectorMapJoinFastHashMultiSet.HashMultiSetResult) hashMultiSetResult; + + optimizedHashMultiSetResult.forget(); + + long hashCode = VectorMapJoinFastLongHashUtil.hashKey(key); + long count = findReadSlot(key, hashCode); + JoinUtil.JoinResult joinResult; + if (count == -1) { + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + optimizedHashMultiSetResult.set(count); + joinResult = JoinUtil.JoinResult.MATCH; + } + + optimizedHashMultiSetResult.setJoinResult(joinResult); + + return joinResult; + } + + public VectorMapJoinFastLongHashMultiSet( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(minMaxEnabled, isOuterJoin, hashTableKeyType, + initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashSet.java new file mode 100644 index 0000000..cd23949 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashSet.java @@ -0,0 +1,84 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashSet; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single long value multi-set optimized for vector map join. + */ +public class VectorMapJoinFastLongHashSet + extends VectorMapJoinFastLongHashTable + implements VectorMapJoinLongHashSet { + + public static final Log LOG = LogFactory.getLog(VectorMapJoinFastLongHashSet.class); + + @Override + public VectorMapJoinHashSetResult createHashSetResult() { + return new VectorMapJoinFastHashSet.HashSetResult(); + } + + @Override + public void assignSlot(int slot, long key, boolean isNewKey, BytesWritable currentValue) { + + int pairIndex = 2 * slot; + if (isNewKey) { + // First entry. + slotPairs[pairIndex] = 1; // Existence. + slotPairs[pairIndex + 1] = key; + } + } + + @Override + public JoinResult contains(long key, VectorMapJoinHashSetResult hashSetResult) { + + VectorMapJoinFastHashSet.HashSetResult optimizedHashSetResult = + (VectorMapJoinFastHashSet.HashSetResult) hashSetResult; + + optimizedHashSetResult.forget(); + + long hashCode = VectorMapJoinFastLongHashUtil.hashKey(key); + long existance = findReadSlot(key, hashCode); + JoinUtil.JoinResult joinResult; + if (existance == -1) { + joinResult = JoinUtil.JoinResult.NOMATCH; + } else { + joinResult = JoinUtil.JoinResult.MATCH; + } + + optimizedHashSetResult.setJoinResult(joinResult); + + return joinResult; + + } + + public VectorMapJoinFastLongHashSet( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(minMaxEnabled, isOuterJoin, hashTableKeyType, + initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashTable.java new file mode 100644 index 0000000..b448e1f --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashTable.java @@ -0,0 +1,284 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashTable; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableDeserializeRead; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; +import org.apache.hadoop.io.BytesWritable; +import org.apache.tez.runtime.library.api.KeyValueReader; + +import com.google.common.annotations.VisibleForTesting; + +/* + * An single long value map optimized for vector map join. + */ +public abstract class VectorMapJoinFastLongHashTable + extends VectorMapJoinFastHashTable + implements VectorMapJoinLongHashTable { + + public static final Log LOG = LogFactory.getLog(VectorMapJoinFastLongHashTable.class); + + private HashTableKeyType hashTableKeyType; + + private boolean isOuterJoin; + + private BinarySortableDeserializeRead keyBinarySortableDeserializeRead; + + private boolean useMinMax; + private long min; + private long max; + + private BytesWritable testValueBytesWritable; + + @Override + public boolean useMinMax() { + return useMinMax; + } + + @Override + public long min() { + return min; + } + + @Override + public long max() { + return max; + } + + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) throws HiveException, IOException { + byte[] keyBytes = currentKey.getBytes(); + int keyLength = currentKey.getLength(); + keyBinarySortableDeserializeRead.set(keyBytes, 0, keyLength); + if (keyBinarySortableDeserializeRead.readCheckNull()) { + if (isOuterJoin) { + return; + } else { + // For inner join, we expect all NULL values to have been filtered out before now. + throw new HiveException("Unexpected NULL in map join small table"); + } + } + + long key = VectorMapJoinFastLongHashUtil.deserializeLongKey( + keyBinarySortableDeserializeRead, hashTableKeyType); + + add(key, currentValue); + } + + + @VisibleForTesting + public void putRow(long currentKey, byte[] currentValue) throws HiveException, IOException { + if (testValueBytesWritable == null) { + testValueBytesWritable = new BytesWritable(); + } + testValueBytesWritable.set(currentValue, 0, currentValue.length); + add(currentKey, testValueBytesWritable); + } + + + protected abstract void assignSlot(int slot, long key, boolean isNewKey, BytesWritable currentValue); + + public void add(long key, BytesWritable currentValue) { + + if (resizeThreshold <= keysAssigned) { + expandAndRehash(); + } + + long hashCode = VectorMapJoinFastLongHashUtil.hashKey(key); + int intHashCode = (int) hashCode; + int slot = (intHashCode & logicalHashBucketMask); + long probeSlot = slot; + int i = 0; + boolean isNewKey; + while (true) { + int pairIndex = 2 * slot; + long valueRef = slotPairs[pairIndex]; + if (valueRef == 0) { + // LOG.info("VectorMapJoinFastLongHashTable add key " + key + " slot " + slot + " pairIndex " + pairIndex + " empty slot (i = " + i + ")"); + isNewKey = true; + break; + } + long tableKey = slotPairs[pairIndex + 1]; + if (key == tableKey) { + // LOG.info("VectorMapJoinFastLongHashTable add key " + key + " slot " + slot + " pairIndex " + pairIndex + " found key (i = " + i + ")"); + isNewKey = false; + break; + } + ++metricPutConflict; + // Some other key (collision) - keep probing. + probeSlot += (++i); + slot = (int)(probeSlot & logicalHashBucketMask); + } + + if (largestNumberOfSteps < i) { + if (LOG.isDebugEnabled()) { + LOG.debug("Probed " + i + " slots (the longest so far) to find space"); + } + largestNumberOfSteps = i; + // debugDumpKeyProbe(keyOffset, keyLength, hashCode, slot); + } + + // LOG.info("VectorMapJoinFastLongHashTable add slot " + slot + " hashCode " + Long.toHexString(hashCode)); + + assignSlot(slot, key, isNewKey, currentValue); + + if (isNewKey) { + keysAssigned++; + if (useMinMax) { + if (key < min) { + min = key; + } + if (key > max) { + max = key; + } + } + } + } + + private void expandAndRehash() { + + int newLogicalHashBucketCount = logicalHashBucketCount * 2; + int newLogicalHashBucketMask = newLogicalHashBucketCount - 1; + int newMetricPutConflict = 0; + int newLargestNumberOfSteps = 0; + + int newSlotPairArraySize = newLogicalHashBucketCount * 2; + long[] newSlotPairs = new long[newSlotPairArraySize]; + + for (int slot = 0; slot < logicalHashBucketCount; slot++) { + int pairIndex = slot * 2; + long valueRef = slotPairs[pairIndex]; + if (valueRef != 0) { + long tableKey = slotPairs[pairIndex + 1]; + + // Copy to new slot table. + long hashCode = VectorMapJoinFastLongHashUtil.hashKey(tableKey); + int intHashCode = (int) hashCode; + int newSlot = intHashCode & newLogicalHashBucketMask; + long newProbeSlot = newSlot; + int newPairIndex; + int i = 0; + while (true) { + newPairIndex = newSlot * 2; + long newValueRef = newSlotPairs[newPairIndex]; + if (newValueRef == 0) { + break; + } + ++newMetricPutConflict; + // Some other key (collision) - keep probing. + newProbeSlot += (++i); + newSlot = (int)(newProbeSlot & newLogicalHashBucketMask); + } + + if (newLargestNumberOfSteps < i) { + if (LOG.isDebugEnabled()) { + LOG.debug("Probed " + i + " slots (the longest so far) to find space"); + } + newLargestNumberOfSteps = i; + // debugDumpKeyProbe(keyOffset, keyLength, hashCode, slot); + } + + // Use old value reference word. + // LOG.info("VectorMapJoinFastLongHashTable expandAndRehash key " + tableKey + " slot " + newSlot + " newPairIndex " + newPairIndex + " empty slot (i = " + i + ")"); + + newSlotPairs[newPairIndex] = valueRef; + newSlotPairs[newPairIndex + 1] = tableKey; + } + } + + slotPairs = newSlotPairs; + logicalHashBucketCount = newLogicalHashBucketCount; + logicalHashBucketMask = newLogicalHashBucketMask; + metricPutConflict = newMetricPutConflict; + largestNumberOfSteps = newLargestNumberOfSteps; + resizeThreshold = (int)(logicalHashBucketCount * loadFactor); + metricExpands++; + // LOG.info("VectorMapJoinFastLongHashTable expandAndRehash new logicalHashBucketCount " + logicalHashBucketCount + " resizeThreshold " + resizeThreshold + " metricExpands " + metricExpands); + } + + protected long findReadSlot(long key, long hashCode) { + + int intHashCode = (int) hashCode; + int slot = intHashCode & logicalHashBucketMask; + + long probeSlot = slot; + int i = 0; + while (true) { + int pairIndex = 2 * slot; + long valueRef = slotPairs[pairIndex]; + if (valueRef == 0) { + // Given that we do not delete, an empty slot means no match. + // LOG.info("VectorMapJoinFastLongHashTable findReadSlot key " + key + " slot " + slot + " pairIndex " + pairIndex + " empty slot (i = " + i + ")"); + return -1; + } + long tableKey = slotPairs[pairIndex + 1]; + if (key == tableKey) { + // LOG.info("VectorMapJoinFastLongHashTable findReadSlot key " + key + " slot " + slot + " pairIndex " + pairIndex + " found key (i = " + i + ")"); + return slotPairs[pairIndex]; + } + // Some other key (collision) - keep probing. + probeSlot += (++i); + if (i > largestNumberOfSteps) { + // LOG.info("VectorMapJoinFastLongHashTable findReadSlot returning not found"); + // We know we never went that far when we were inserting. + // LOG.info("VectorMapJoinFastLongHashTable findReadSlot key " + key + " slot " + slot + " pairIndex " + pairIndex + " largestNumberOfSteps " + largestNumberOfSteps + " (i = " + i + ")"); + return -1; + } + slot = (int)(probeSlot & logicalHashBucketMask); + } + } + + /* + * The hash table slots. For a long key hash table, each slot is 2 longs and the array is + * 2X sized. + * + * The slot pair is 1) a non-zero reference word to the first value bytes and 2) the long value. + */ + protected long[] slotPairs; + + private void allocateBucketArray() { + int slotPairArraySize = 2 * logicalHashBucketCount; + slotPairs = new long[slotPairArraySize]; + } + + public VectorMapJoinFastLongHashTable( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + this.isOuterJoin = isOuterJoin; + this.hashTableKeyType = hashTableKeyType; + PrimitiveTypeInfo[] primitiveTypeInfos = { TypeInfoFactory.longTypeInfo }; + keyBinarySortableDeserializeRead = new BinarySortableDeserializeRead(primitiveTypeInfos); + allocateBucketArray(); + useMinMax = minMaxEnabled; + min = Long.MAX_VALUE; + max = Long.MIN_VALUE; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashUtil.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashUtil.java new file mode 100644 index 0000000..298ca61 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastLongHashUtil.java @@ -0,0 +1,63 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableDeserializeRead; + +public class VectorMapJoinFastLongHashUtil { + + public static long hashKey(long key) { + key = (~key) + (key << 21); // key = (key << 21) - key - 1; + key = key ^ (key >>> 24); + key = (key + (key << 3)) + (key << 8); // key * 265 + key = key ^ (key >>> 14); + key = (key + (key << 2)) + (key << 4); // key * 21 + key = key ^ (key >>> 28); + key = key + (key << 31); + return key; + } + + public static long deserializeLongKey(BinarySortableDeserializeRead keyBinarySortableDeserializeRead, + HashTableKeyType hashTableKeyType) throws IOException { + long key = 0; + switch (hashTableKeyType) { + case BOOLEAN: + key = (keyBinarySortableDeserializeRead.readBoolean() ? 1 : 0); + break; + case BYTE: + key = (long) keyBinarySortableDeserializeRead.readByte(); + break; + case SHORT: + key = (long) keyBinarySortableDeserializeRead.readShort(); + break; + case INT: + key = (long) keyBinarySortableDeserializeRead.readInt(); + break; + case LONG: + key = keyBinarySortableDeserializeRead.readLong(); + break; + default: + throw new RuntimeException("Unexpected hash table key type " + hashTableKeyType.name()); + } + return key; + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashMap.java new file mode 100644 index 0000000..b962475 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashMap.java @@ -0,0 +1,39 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import com.google.common.annotations.VisibleForTesting; + +/* + * An multi-key value hash map optimized for vector map join. + */ +public class VectorMapJoinFastMultiKeyHashMap + extends VectorMapJoinFastBytesHashMap { + + @VisibleForTesting + public VectorMapJoinFastMultiKeyHashMap(int initialCapacity, float loadFactor, int wbSize) { + this(false, initialCapacity, loadFactor, wbSize, -1); + } + + public VectorMapJoinFastMultiKeyHashMap( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashMultiSet.java new file mode 100644 index 0000000..71a62fe --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashMultiSet.java @@ -0,0 +1,32 @@ +/** + * 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.exec.vector.mapjoin.fast; + +/* + * An multi-key value hash multi-set optimized for vector map join. + */ +public class VectorMapJoinFastMultiKeyHashMultiSet + extends VectorMapJoinFastBytesHashMultiSet { + + public VectorMapJoinFastMultiKeyHashMultiSet( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashSet.java new file mode 100644 index 0000000..dad3b32 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastMultiKeyHashSet.java @@ -0,0 +1,32 @@ +/** + * 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.exec.vector.mapjoin.fast; + +/* + * An multi-key value hash set optimized for vector map join. + */ +public class VectorMapJoinFastMultiKeyHashSet + extends VectorMapJoinFastBytesHashSet { + + public VectorMapJoinFastMultiKeyHashSet( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringCommon.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringCommon.java new file mode 100644 index 0000000..5c7792f --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringCommon.java @@ -0,0 +1,67 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableDeserializeRead; +import org.apache.hadoop.hive.serde2.fast.DeserializeRead.ReadStringResults; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash map optimized for vector map join. + */ +public class VectorMapJoinFastStringCommon { + + private boolean isOuterJoin; + + private BinarySortableDeserializeRead keyBinarySortableDeserializeRead; + + private ReadStringResults readStringResults; + + public void adaptPutRow(VectorMapJoinFastBytesHashTable hashTable, + BytesWritable currentKey, BytesWritable currentValue) throws HiveException, IOException { + + byte[] keyBytes = currentKey.getBytes(); + int keyLength = currentKey.getLength(); + keyBinarySortableDeserializeRead.set(keyBytes, 0, keyLength); + if (keyBinarySortableDeserializeRead.readCheckNull()) { + if (isOuterJoin) { + return; + } else { + // For inner join, we expect all NULL values to have been filtered out before now. + throw new HiveException("Unexpected NULL in map join small table"); + } + } + keyBinarySortableDeserializeRead.readString(readStringResults); + + hashTable.add(readStringResults.bytes, readStringResults.start, readStringResults.length, + currentValue); + } + + public VectorMapJoinFastStringCommon(boolean isOuterJoin) { + this.isOuterJoin = isOuterJoin; + PrimitiveTypeInfo[] primitiveTypeInfos = { TypeInfoFactory.stringTypeInfo }; + keyBinarySortableDeserializeRead = new BinarySortableDeserializeRead(primitiveTypeInfos); + readStringResults = keyBinarySortableDeserializeRead.createReadStringResults(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashMap.java new file mode 100644 index 0000000..c80ea89 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashMap.java @@ -0,0 +1,44 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash map optimized for vector map join. + */ +public class VectorMapJoinFastStringHashMap extends VectorMapJoinFastBytesHashMap { + + private VectorMapJoinFastStringCommon stringCommon; + + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) throws HiveException, IOException { + stringCommon.adaptPutRow(this, currentKey, currentValue); + } + + public VectorMapJoinFastStringHashMap( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + stringCommon = new VectorMapJoinFastStringCommon(isOuterJoin); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashMultiSet.java new file mode 100644 index 0000000..4933b16 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashMultiSet.java @@ -0,0 +1,44 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash map optimized for vector map join. + */ +public class VectorMapJoinFastStringHashMultiSet extends VectorMapJoinFastBytesHashMultiSet { + + private VectorMapJoinFastStringCommon stringCommon; + + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) throws HiveException, IOException { + stringCommon.adaptPutRow(this, currentKey, currentValue); + } + + public VectorMapJoinFastStringHashMultiSet( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + stringCommon = new VectorMapJoinFastStringCommon(isOuterJoin); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashSet.java new file mode 100644 index 0000000..ae8d943 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastStringHashSet.java @@ -0,0 +1,44 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.io.BytesWritable; + +/* + * An single byte array value hash map optimized for vector map join. + */ +public class VectorMapJoinFastStringHashSet extends VectorMapJoinFastBytesHashSet { + + private VectorMapJoinFastStringCommon stringCommon; + + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) throws HiveException, IOException { + stringCommon.adaptPutRow(this, currentKey, currentValue); + } + + public VectorMapJoinFastStringHashSet( + boolean isOuterJoin, + int initialCapacity, float loadFactor, int writeBuffersSize, long memUsage) { + super(initialCapacity, loadFactor, writeBuffersSize, memUsage); + stringCommon = new VectorMapJoinFastStringCommon(isOuterJoin); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastTableContainer.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastTableContainer.java new file mode 100644 index 0000000..0482324 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastTableContainer.java @@ -0,0 +1,226 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.ql.exec.persistence.HashMapWrapper; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinKey; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinObjectSerDeContext; +import org.apache.hadoop.hive.ql.exec.tez.HashTableLoader; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTable; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinTableContainer; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.MapJoinDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableImplementationType; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKind; +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.io.BytesWritable; +import org.apache.hadoop.io.Writable; +import org.apache.tez.runtime.library.api.KeyValueReader; + +/** + * HashTableLoader for Tez constructs the hashtable from records read from + * a broadcast edge. + */ +public class VectorMapJoinFastTableContainer implements VectorMapJoinTableContainer { + + private static final Log LOG = LogFactory.getLog(HashTableLoader.class.getName()); + + private MapJoinDesc desc; + private Configuration hconf; + + private float keyCountAdj; + private int threshold; + private float loadFactor; + private int wbSize; + private long keyCount; + private long memUsage; + + + private VectorMapJoinFastHashTable VectorMapJoinFastHashTable; + + public VectorMapJoinFastTableContainer(MapJoinDesc desc, Configuration hconf, + long keyCount, long memUsage) throws SerDeException { + + this.desc = desc; + this.hconf = hconf; + + keyCountAdj = HiveConf.getFloatVar(hconf, HiveConf.ConfVars.HIVEHASHTABLEKEYCOUNTADJUSTMENT); + threshold = HiveConf.getIntVar(hconf, HiveConf.ConfVars.HIVEHASHTABLETHRESHOLD); + loadFactor = HiveConf.getFloatVar(hconf, HiveConf.ConfVars.HIVEHASHTABLELOADFACTOR); + wbSize = HiveConf.getIntVar(hconf, HiveConf.ConfVars.HIVEHASHTABLEWBSIZE); + + this.keyCount = keyCount; + this.memUsage = memUsage; + + // LOG.info("VectorMapJoinFastTableContainer load keyCountAdj " + keyCountAdj); + // LOG.info("VectorMapJoinFastTableContainer load threshold " + threshold); + // LOG.info("VectorMapJoinFastTableContainer load loadFactor " + loadFactor); + // LOG.info("VectorMapJoinFastTableContainer load wbSize " + wbSize); + // LOG.info("VectorMapJoinFastTableContainer load memUsage " + memUsage); + + int newThreshold = HashMapWrapper.calculateTableSize( + keyCountAdj, threshold, loadFactor, keyCount); + + // LOG.info("VectorMapJoinFastTableContainer load newThreshold " + newThreshold); + + VectorMapJoinFastHashTable = createHashTable(newThreshold); + } + + @Override + public VectorMapJoinHashTable vectorMapJoinHashTable() { + return (VectorMapJoinHashTable) VectorMapJoinFastHashTable; + } + + private VectorMapJoinFastHashTable createHashTable(int newThreshold) { + + boolean isOuterJoin = !desc.isNoOuterJoin(); + VectorMapJoinDesc vectorDesc = desc.getVectorDesc(); + HashTableImplementationType hashTableImplementationType = vectorDesc.hashTableImplementationType(); + HashTableKind hashTableKind = vectorDesc.hashTableKind(); + HashTableKeyType hashTableKeyType = vectorDesc.hashTableKeyType(); + boolean minMaxEnabled = vectorDesc.minMaxEnabled(); + + int writeBufferSize = HiveConf.getIntVar(hconf, HiveConf.ConfVars.HIVEHASHTABLEWBSIZE); + + VectorMapJoinFastHashTable hashTable = null; + + switch (hashTableKeyType) { + case BOOLEAN: + case BYTE: + case SHORT: + case INT: + case LONG: + switch (hashTableKind) { + case HASH_MAP: + hashTable = new VectorMapJoinFastLongHashMap( + minMaxEnabled, isOuterJoin, hashTableKeyType, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + case HASH_MULTISET: + hashTable = new VectorMapJoinFastLongHashMultiSet( + minMaxEnabled, isOuterJoin, hashTableKeyType, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + case HASH_SET: + hashTable = new VectorMapJoinFastLongHashSet( + minMaxEnabled, isOuterJoin, hashTableKeyType, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + } + break; + + case STRING: + switch (hashTableKind) { + case HASH_MAP: + hashTable = new VectorMapJoinFastStringHashMap( + isOuterJoin, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + case HASH_MULTISET: + hashTable = new VectorMapJoinFastStringHashMultiSet( + isOuterJoin, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + case HASH_SET: + hashTable = new VectorMapJoinFastStringHashSet( + isOuterJoin, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + } + break; + + case MULTI_KEY: + switch (hashTableKind) { + case HASH_MAP: + hashTable = new VectorMapJoinFastMultiKeyHashMap( + isOuterJoin, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + case HASH_MULTISET: + hashTable = new VectorMapJoinFastMultiKeyHashMultiSet( + isOuterJoin, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + case HASH_SET: + hashTable = new VectorMapJoinFastMultiKeyHashSet( + isOuterJoin, + newThreshold, loadFactor, writeBufferSize, memUsage); + break; + } + break; + } + + return hashTable; + } + + public void putRow(KeyValueReader kvReader) throws HiveException, IOException, SerDeException { + VectorMapJoinFastHashTable.putRow((BytesWritable) kvReader.getCurrentKey(), (BytesWritable) kvReader.getCurrentValue()); + } + + @Override + public MapJoinKey putRow(MapJoinObjectSerDeContext keyContext, + Writable currentKey, MapJoinObjectSerDeContext valueContext, + Writable currentValue) throws SerDeException, HiveException { + throw new UnsupportedOperationException("Not applicable"); + } + + @Override + public void seal() { + // Do nothing + } + + @Override + public ReusableGetAdaptor createGetter(MapJoinKey keyTypeFromLoader) { + throw new RuntimeException("Not applicable"); + } + + @Override + public void clear() { + throw new RuntimeException("Not applicable"); + } + + @Override + public MapJoinKey getAnyKey() { + throw new RuntimeException("Not applicable"); + } + + @Override + public void dumpMetrics() { + // TODO + } + + @Override + public boolean hasSpill() { + return false; + } + + /* + @Override + public com.esotericsoftware.kryo.io.Output getHybridBigTableSpillOutput(int partitionId) { + throw new RuntimeException("Not applicable"); + } + */ +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastValueStore.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastValueStore.java new file mode 100644 index 0000000..d9823ed --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/VectorMapJoinFastValueStore.java @@ -0,0 +1,460 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.serde2.WriteBuffers; +import org.apache.hadoop.hive.serde2.WriteBuffers.ByteSegmentRef; +import org.apache.hadoop.hive.serde2.WriteBuffers.Position;; + + +// Supports random access. + +public class VectorMapJoinFastValueStore { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinFastValueStore.class.getName()); + + private WriteBuffers writeBuffers; + + public WriteBuffers writeBuffers() { + return writeBuffers; + } + + public static class HashMapResult extends VectorMapJoinHashMapResult { + + private VectorMapJoinFastValueStore valueStore; + + private boolean hasRows; + private long valueRefWord; + private boolean isSingleRow; + private int cappedCount; + + private boolean haveReadCurrent; + private int readIndex; + private boolean isEof; + + private boolean isNextEof; + private boolean isNextLast; + long nextAbsoluteValueOffset; + boolean isNextValueLengthSmall; + int nextSmallValueLength; + + private ByteSegmentRef byteSegmentRef; + private Position readPos; + + public HashMapResult() { + super(); + valueRefWord = -1; + hasRows = false; + byteSegmentRef = new ByteSegmentRef(); + readPos = new Position(); + } + + public void set(VectorMapJoinFastValueStore valueStore, long valueRefWord) { + // LOG.info("VectorMapJoinFastValueStore set valueRefWord " + Long.toHexString(valueRefWord)); + + this.valueStore = valueStore; + this.valueRefWord = valueRefWord; + + hasRows = true; + isSingleRow = ((valueRefWord & IsLastFlag.flagOnMask) != 0); + cappedCount = + (int) ((valueRefWord & CappedCount.bitMask) >> CappedCount.bitShift); + // Position to beginning. + haveReadCurrent = false; + readIndex = 0; + isEof = false; + } + + @Override + public boolean hasRows() { + return hasRows; + } + + @Override + public boolean isSingleRow() { + if (!hasRows) { + return false; + } + + return isSingleRow; + } + + @Override + public boolean isCappedCountAvailable() { + return true; + } + + @Override + public int cappedCount() { + if (!hasRows) { + return 0; + } + + return cappedCount; + } + + @Override + public ByteSegmentRef first() { + if (!hasRows) { + return null; + } + + // Position to beginning. + haveReadCurrent = false; + readIndex = 0; + isEof = false; + + return internalRead(); + } + + @Override + public ByteSegmentRef next() { + if (!hasRows) { + return null; + } + + return internalRead(); + } + + + public ByteSegmentRef internalRead() { + + long absoluteValueOffset; + + int valueLength; + + if (readIndex == 0) { + /* + * Extract information from reference word from slot table. + */ + absoluteValueOffset = + (valueRefWord & AbsoluteValueOffset.bitMask); + + // Position before the last written value. + valueStore.writeBuffers.setReadPoint(absoluteValueOffset, readPos); + + if (isSingleRow) { + isNextEof = true; + + valueLength = + (int) ((valueRefWord & SmallValueLength.bitMask) >> SmallValueLength.bitShift); + boolean isValueLengthSmall = (valueLength != SmallValueLength.allBitsOn); + if (!isValueLengthSmall) { + // And, if current value is big we must read it. + valueLength = valueStore.writeBuffers.readVInt(readPos); + } + } else { + isNextEof = false; + + // 2nd and beyond records have a relative offset word at the beginning. + long relativeOffsetWord = valueStore.writeBuffers.readVLong(readPos); + + long relativeOffset = + (relativeOffsetWord & NextRelativeValueOffset.bitMask) >> NextRelativeValueOffset.bitShift; + + nextAbsoluteValueOffset = absoluteValueOffset - relativeOffset; + + isNextLast = ((relativeOffsetWord & IsNextValueLastFlag.flagOnMask) != 0); + isNextValueLengthSmall = + ((relativeOffsetWord & IsNextValueLengthSmallFlag.flagOnMask) != 0); + } + + valueLength = + (int) ((valueRefWord & SmallValueLength.bitMask) >> SmallValueLength.bitShift); + boolean isValueLengthSmall = (valueLength != SmallValueLength.allBitsOn); + if (!isValueLengthSmall) { + // And, if current value is big we must read it. + valueLength = valueStore.writeBuffers.readVInt(readPos); + } + + // 2nd and beyond have the next value's small length in the current record. + if (isNextValueLengthSmall) { + nextSmallValueLength = valueStore.writeBuffers.readVInt(readPos); + } else { + nextSmallValueLength = -1; + } + + } else { + if (isNextEof) { + return null; + } + + absoluteValueOffset = nextAbsoluteValueOffset; + + // Position before the last written value. + valueStore.writeBuffers.setReadPoint(absoluteValueOffset, readPos); + + if (isNextLast) { + isNextEof = true; + + if (isNextValueLengthSmall) { + valueLength = nextSmallValueLength; + } else { + valueLength = (int) valueStore.writeBuffers.readVLong(readPos); + } + } else { + isNextEof = false; + + // 2nd and beyond records have a relative offset word at the beginning. + long relativeOffsetWord = valueStore.writeBuffers.readVLong(readPos); + + // Read current value's big length now, if necessary. + if (isNextValueLengthSmall) { + valueLength = nextSmallValueLength; + } else { + valueLength = (int) valueStore.writeBuffers.readVLong(readPos); + } + + long relativeOffset = + (relativeOffsetWord & NextRelativeValueOffset.bitMask) >> NextRelativeValueOffset.bitShift; + + nextAbsoluteValueOffset = absoluteValueOffset - relativeOffset; + + isNextLast = ((relativeOffsetWord & IsNextValueLastFlag.flagOnMask) != 0); + isNextValueLengthSmall = + ((relativeOffsetWord & IsNextValueLengthSmallFlag.flagOnMask) != 0); + if (isNextValueLengthSmall) { + // TODO: Write readVInt + nextSmallValueLength = (int) valueStore.writeBuffers.readVLong(readPos); + } else { + nextSmallValueLength = -1; + } + } + } + + // Our reading is positioned to the value. + valueStore.writeBuffers.getByteSegmentRefToCurrent(byteSegmentRef, valueLength, readPos); + + readIndex++; + return byteSegmentRef; + } + + @Override + public boolean isEof() { + if (!hasRows) { + return true; + } + return isEof; + } + + @Override + public void forget() { + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("(" + super.toString() + ", "); + sb.append("cappedCount " + cappedCount() + ")"); + return sb.toString(); + } + } + + /* + * Value Reference Word. + */ + + // Lowest field. + private final class AbsoluteValueOffset { + private static final int bitLength = 40; + private static final long allBitsOn = (1L << bitLength) - 1; + private static final long bitMask = allBitsOn; + + // Make it a power of 2. + private static final long maxSize = 1L << (bitLength - 2); + } + + private final class SmallValueLength { + private static final int bitLength = 10; + private static final int allBitsOn = (1 << bitLength) - 1; + private static final int threshold = allBitsOn; // Lower this for big value testing. + private static final int bitShift = AbsoluteValueOffset.bitLength; + private static final long bitMask = ((long) allBitsOn) << bitShift; + } + + private final class CappedCount { + private static final int bitLength = 10; + private static final int allBitsOn = (1 << bitLength) - 1; + private static final int limit = allBitsOn; + private static final int bitShift = SmallValueLength.bitShift + SmallValueLength.bitLength; + private static final long bitMask = ((long) allBitsOn) << bitShift; + } + + private final class IsLastFlag { + private static final int bitShift = CappedCount.bitShift + CappedCount.bitLength;; + private static final long flagOnMask = 1L << bitShift; + } + + private final class IsInvalidFlag { + private static final int bitShift = 63; + private static final long flagOnMask = 1L << bitShift; + } + + /* + * Relative Offset Word stored at the beginning of a value. + * + * We put the flags at the low end of the word so VLong will encode it smaller. + */ + + private final class IsNextValueLengthSmallFlag { + private static final int bitLength = 1; + private static final long flagOnMask = 1L; + } + + private final class IsNextValueLastFlag { + private static final int bitLength = 1; + private static final int bitShift = IsNextValueLengthSmallFlag.bitLength; + private static final long flagOnMask = 1L << bitShift; + } + + private final class NextRelativeValueOffset { + private static final int bitLength = 40; + private static final long allBitsOn = (1L << bitLength) - 1; + private static final int bitShift = IsNextValueLastFlag.bitShift + IsNextValueLastFlag.bitLength; + private static final long bitMask = allBitsOn << bitShift; + } + + public long addFirst(byte[] valueBytes, int valueStart, int valueLength) { + + // First value is written without: next relative offset, next value length, is next value last + // flag, is next value length small flag, etc. + + /* + * We build up the Value Reference Word we will return that will be kept by the caller. + */ + + long valueRefWord = IsLastFlag.flagOnMask; + + valueRefWord |= ((long) 1 << CappedCount.bitShift); + + long newAbsoluteOffset; + if (valueLength < SmallValueLength.threshold) { + + // Small case: Just write the value bytes only. + + if (valueLength == 0) { + // We don't write a first empty value. + // Get an offset to reduce the relative offset later if there are more than 1 value. + newAbsoluteOffset = writeBuffers.getWritePoint(); + } else { + newAbsoluteOffset = writeBuffers.getWritePoint(); + writeBuffers.write(valueBytes, valueStart, valueLength); + } + + // The caller remembers the small value length. + valueRefWord |= ((long) valueLength) << SmallValueLength.bitShift; + } else { + + // Big case: write the length as a VInt and then the value bytes. + + newAbsoluteOffset = writeBuffers.getWritePoint(); + + writeBuffers.writeVInt(valueLength); + writeBuffers.write(valueBytes, valueStart, valueLength); + + // Use magic length value to indicate big. + valueRefWord |= ((long) SmallValueLength.allBitsOn) << SmallValueLength.bitShift; + } + + // LOG.info("VectorMapJoinFastValueStore addFirst valueLength " + valueLength + " newAbsoluteOffset " + newAbsoluteOffset + " valueRefWord " + Long.toHexString(valueRefWord)); + + // The lower bits are the absolute value offset. + valueRefWord |= newAbsoluteOffset; + + return valueRefWord; + } + + public long addMore(long oldValueRef, byte[] valueBytes, int valueStart, int valueLength) { + + if ((oldValueRef & IsInvalidFlag.flagOnMask) != 0) { + throw new RuntimeException("Invalid optimized hash table reference"); + } + /* + * Extract information about the old value. + */ + long oldAbsoluteValueOffset = + (oldValueRef & AbsoluteValueOffset.bitMask); + int oldSmallValueLength = + (int) ((oldValueRef & SmallValueLength.bitMask) >> SmallValueLength.bitShift); + boolean isOldValueLengthSmall = (oldSmallValueLength != SmallValueLength.allBitsOn); + int oldCappedCount = + (int) ((oldValueRef & CappedCount.bitMask) >> CappedCount.bitShift); + boolean isOldValueLast = + ((oldValueRef & IsLastFlag.flagOnMask) != 0); + + // LOG.info("VectorMapJoinFastValueStore addMore isOldValueLast " + isOldValueLast + " oldSmallValueLength " + oldSmallValueLength + " oldAbsoluteValueOffset " + oldAbsoluteValueOffset + " oldValueRef " + Long.toHexString(oldValueRef)); + + /* + * Write information about the old value (which becomes our next) at the beginning + * of our new value. + */ + long newAbsoluteOffset = writeBuffers.getWritePoint(); + + long relativeOffsetWord = 0; + if (isOldValueLengthSmall) { + relativeOffsetWord |= IsNextValueLengthSmallFlag.flagOnMask; + } + if (isOldValueLast) { + relativeOffsetWord |= IsNextValueLastFlag.flagOnMask; + } + int newCappedCount = oldCappedCount; + if (newCappedCount < CappedCount.limit) { + newCappedCount++; + } + long relativeOffset = newAbsoluteOffset - oldAbsoluteValueOffset; + relativeOffsetWord |= (relativeOffset << NextRelativeValueOffset.bitShift); + + writeBuffers.writeVLong(relativeOffsetWord); + + // When the next value is small it was not recorded with the old (i.e. next) value and we + // have to remember it. + if (isOldValueLengthSmall) { + writeBuffers.writeVInt(oldSmallValueLength); + } + + // Now, we have written all information about the next value, work on the *new* value. + + long newValueRef = ((long) newCappedCount) << CappedCount.bitShift; + boolean isNewValueSmall = (valueLength < SmallValueLength.threshold); + if (!isNewValueSmall) { + // Use magic value to indicating we are writing the big value length. + newValueRef |= ((long) SmallValueLength.allBitsOn << SmallValueLength.bitShift); + writeBuffers.writeVInt(valueLength); + } else { + // Caller must remember small value length. + newValueRef |= ((long) valueLength) << SmallValueLength.bitShift; + } + writeBuffers.write(valueBytes, valueStart, valueLength); + + // The lower bits are the absolute value offset. + newValueRef |= newAbsoluteOffset; + + // LOG.info("VectorMapJoinFastValueStore addMore valueLength " + valueLength + " newAbsoluteOffset " + newAbsoluteOffset + " newValueRef " + Long.toHexString(newValueRef)); + + return newValueRef; + } + + public VectorMapJoinFastValueStore(int writeBuffersSize) { + writeBuffers = new WriteBuffers(writeBuffersSize, AbsoluteValueOffset.maxSize); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashMap.java new file mode 100644 index 0000000..512db1b --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashMap.java @@ -0,0 +1,51 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * The interface for a single byte array key hash map lookup method. + */ +public interface VectorMapJoinBytesHashMap + extends VectorMapJoinBytesHashTable, VectorMapJoinHashMap { + + /* + * Lookup a byte array key in the hash map. + * + * @param keyBytes + * A byte array containing the key within a range. + * @param keyStart + * The offset the beginning of the key. + * @param keyLength + * The length of the key. + * @param hashMapResult + * The object to receive small table value(s) information on a MATCH. + * Or, for SPILL, it has information on where to spill the big table row. + * + * @return + * Whether the lookup was a match, no match, or spill (the partition with the key + * is currently spilled). + */ + JoinUtil.JoinResult lookup(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashMapResult hashMapResult) throws IOException; + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashMultiSet.java new file mode 100644 index 0000000..196403d --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashMultiSet.java @@ -0,0 +1,51 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * The interface for a single byte array key hash multi-set contains method. + */ +public interface VectorMapJoinBytesHashMultiSet + extends VectorMapJoinBytesHashTable, VectorMapJoinHashMultiSet { + + /* + * Lookup an byte array key in the hash multi-set. + * + * @param keyBytes + * A byte array containing the key within a range. + * @param keyStart + * The offset the beginning of the key. + * @param keyLength + * The length of the key. + * @param hashMultiSetResult + * The object to receive small table value(s) information on a MATCH. + * Or, for SPILL, it has information on where to spill the big table row. + * + * @return + * Whether the lookup was a match, no match, or spilled (the partition with the key + * is currently spilled). + */ + JoinUtil.JoinResult contains(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashMultiSetResult hashMultiSetResult) throws IOException; + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashSet.java new file mode 100644 index 0000000..a0c93e5 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashSet.java @@ -0,0 +1,51 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * The interface for a single byte array key hash multi-set contains method. + */ +public interface VectorMapJoinBytesHashSet + extends VectorMapJoinBytesHashTable, VectorMapJoinHashSet { + + /* + * Lookup an byte array key in the hash set. + * + * @param keyBytes + * A byte array containing the key within a range. + * @param keyStart + * The offset the beginning of the key. + * @param keyLength + * The length of the key. + * @param hashSetResult + * The object to receive small table value(s) information on a MATCH. + * Or, for SPILL, it has information on where to spill the big table row. + * + * @return + * Whether the lookup was a match, no match, or spilled (the partition with the key + * is currently spilled). + */ + JoinUtil.JoinResult contains(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashSetResult hashSetResult) throws IOException; + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashTable.java new file mode 100644 index 0000000..7494e1d --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinBytesHashTable.java @@ -0,0 +1,26 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +/* + * Interface for a vector map join hash table (which could be a hash map, hash multi-set, or + * hash set) for a single byte array key. + */ +public interface VectorMapJoinBytesHashTable extends VectorMapJoinHashTable { +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMap.java new file mode 100644 index 0000000..7abe2c8 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMap.java @@ -0,0 +1,34 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +/* + * The root interface for a vector map join hash map. + */ +public interface VectorMapJoinHashMap extends VectorMapJoinHashTable { + + /* + * @return A new hash map result implementation specific object. + * + * The object can be used to access the values when there is a match, or + * access spill information when the partition with the key is currently spilled. + */ + VectorMapJoinHashMapResult createHashMapResult(); + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMapResult.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMapResult.java new file mode 100644 index 0000000..fa6dedb --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMapResult.java @@ -0,0 +1,63 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import org.apache.hadoop.hive.serde2.WriteBuffers.ByteSegmentRef; + +/* + * Abstract class for a hash map result. For reading the values, one-by-one. + */ +public abstract class VectorMapJoinHashMapResult extends VectorMapJoinHashTableResult { + + /** + * @return Whether there are any rows (i.e. true for match). + */ + public abstract boolean hasRows(); + + /** + * @return Whether there is 1 value row. + */ + public abstract boolean isSingleRow(); + + /** + * @return Whether there is a capped count available from cappedCount. + */ + public abstract boolean isCappedCountAvailable(); + + /** + * @return The count of values, up to a arbitrary cap limit. When available, the capped + * count can be used to make decisions on how to optimally generate join results. + */ + public abstract int cappedCount(); + + /** + * @return A reference to the first value, or null if there are no values. + */ + public abstract ByteSegmentRef first(); + + /** + * @return The next value, or null if there are no more values to be read. + */ + public abstract ByteSegmentRef next(); + + /** + * @return Whether reading is at the end. + */ + public abstract boolean isEof(); +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMultiSet.java new file mode 100644 index 0000000..210597d --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMultiSet.java @@ -0,0 +1,31 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +public interface VectorMapJoinHashMultiSet extends VectorMapJoinHashTable { + + /* + * @return A new hash multi-set result implementation specific object. + * + * The object can be used to access the *count* of values when the key is contained in the + * multi-set, or access spill information when the partition with the key is currently spilled. + */ + VectorMapJoinHashMultiSetResult createHashMultiSetResult(); + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMultiSetResult.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMultiSetResult.java new file mode 100644 index 0000000..0728f78 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashMultiSetResult.java @@ -0,0 +1,34 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +/* + * Abstract class for a hash multi-set result. + */ +public abstract class VectorMapJoinHashMultiSetResult extends VectorMapJoinHashTableResult { + + protected long count; + + /* + * @return The multi-set count for the lookup key. + */ + public long count() { + return count; + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashSet.java new file mode 100644 index 0000000..a26f997 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashSet.java @@ -0,0 +1,34 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +/* + * The root interface for a vector map join hash set. + */ +public interface VectorMapJoinHashSet extends VectorMapJoinHashTable { + + /* + * @return A new hash set result implementation specific object. + * + * The object can be used to access access spill information when the partition with the key + * is currently spilled. + */ + VectorMapJoinHashSetResult createHashSetResult(); + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashSetResult.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashSetResult.java new file mode 100644 index 0000000..467c4c1 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashSetResult.java @@ -0,0 +1,28 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +/* + * Abstract class for a hash set result. + */ +public abstract class VectorMapJoinHashSetResult extends VectorMapJoinHashTableResult { + + // Nothing currently available for hash sets. + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashTable.java new file mode 100644 index 0000000..7e219ec --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashTable.java @@ -0,0 +1,43 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.io.BytesWritable; + +/* + * Root interface for a vector map join hash table (which could be a hash map, hash multi-set, or + * hash set). + */ +public interface VectorMapJoinHashTable { + + + /* + * @param currentKey + * The current key. + * @param currentValue + * The current value. + */ + void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException; + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashTableResult.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashTableResult.java new file mode 100644 index 0000000..ce598e3 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinHashTableResult.java @@ -0,0 +1,81 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * Root abstract class for a hash table result. + */ +public abstract class VectorMapJoinHashTableResult { + + private JoinUtil.JoinResult joinResult; + + private int spillPartitionId; + + public VectorMapJoinHashTableResult() { + joinResult = JoinUtil.JoinResult.NOMATCH; + spillPartitionId = -1; + } + + /** + * @return The join result from the most recent hash map match, or hash multi-set / set contains + * call. + */ + public JoinUtil.JoinResult joinResult() { + return joinResult; + } + + /** + * Set the current join result. + * @param joinResult + * The new join result. + */ + public void setJoinResult(JoinUtil.JoinResult joinResult) { + this.joinResult = joinResult; + } + + /** + * Forget about the most recent hash table lookup or contains call. + */ + public void forget() { + joinResult = JoinUtil.JoinResult.NOMATCH; + } + + /** + * Set the spill partition id. + */ + public void setSpillPartitionId(int spillPartitionId) { + this.spillPartitionId = spillPartitionId; + } + + /** + * @return The Hybrid Grace spill partition id. + */ + public int spillPartitionId() { + return spillPartitionId; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("joinResult " + joinResult.name()); + return sb.toString(); + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashMap.java new file mode 100644 index 0000000..f180d02 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashMap.java @@ -0,0 +1,46 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * The interface for a single long key hash map lookup method. + */ +public interface VectorMapJoinLongHashMap + extends VectorMapJoinLongHashTable, VectorMapJoinHashMap { + + /* + * Lookup an long in the hash map. + * + * @param key + * The long key. + * @param hashMapResult + * The object to receive small table value(s) information on a MATCH. + * Or, for SPILL, it has information on where to spill the big table row. + * + * @return + * Whether the lookup was a match, no match, or spilled (the partition with the key + * is currently spilled). + */ + JoinUtil.JoinResult lookup(long key, VectorMapJoinHashMapResult hashMapResult) throws IOException; + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashMultiSet.java new file mode 100644 index 0000000..7477584 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashMultiSet.java @@ -0,0 +1,46 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * The interface for a single long key hash multi-set contains method. + */ +public interface VectorMapJoinLongHashMultiSet + extends VectorMapJoinLongHashTable, VectorMapJoinHashMultiSet { + + /* + * Lookup an long in the hash multi-set. + * + * @param key + * The long key. + * @param hashMultiSetResult + * The object to receive small table value(s) information on a MATCH. + * Or, for SPILL, it has information on where to spill the big table row. + * + * @return + * Whether the lookup was a match, no match, or spilled (the partition with the key + * is currently spilled). + */ + JoinUtil.JoinResult contains(long key, VectorMapJoinHashMultiSetResult hashMultiSetResult) throws IOException; + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashSet.java new file mode 100644 index 0000000..8c28bff --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashSet.java @@ -0,0 +1,46 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; + +/* + * The interface adds the single long key hash multi-set contains method. + */ +public interface VectorMapJoinLongHashSet + extends VectorMapJoinLongHashTable, VectorMapJoinHashSet { + + /* + * Lookup an long in the hash set. + * + * @param key + * The long key. + * @param hashSetResult + * The object to receive small table value(s) information on a MATCH. + * Or, for SPILL, it has information on where to spill the big table row. + * + * @return + * Whether the lookup was a match, no match, or spilled (the partition with the key + * is currently spilled). + */ + JoinUtil.JoinResult contains(long key, VectorMapJoinHashSetResult hashSetResult) throws IOException; + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashTable.java new file mode 100644 index 0000000..046a403 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinLongHashTable.java @@ -0,0 +1,31 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +/* + * Interface for a vector map join hash table (which could be a hash map, hash multi-set, or + * hash set) for a single long. + */ +public interface VectorMapJoinLongHashTable extends VectorMapJoinHashTable { + + boolean useMinMax(); + long min(); + long max(); + +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinTableContainer.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinTableContainer.java new file mode 100644 index 0000000..09631e4 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/hashtable/VectorMapJoinTableContainer.java @@ -0,0 +1,28 @@ +/** + * 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.exec.vector.mapjoin.hashtable; + +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; + +public interface VectorMapJoinTableContainer extends MapJoinTableContainer { + + VectorMapJoinHashTable vectorMapJoinHashTable(); + + // com.esotericsoftware.kryo.io.Output getHybridBigTableSpillOutput(int partitionId); +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedCreateHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedCreateHashTable.java new file mode 100644 index 0000000..5442834 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedCreateHashTable.java @@ -0,0 +1,129 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinKey; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.plan.MapJoinDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKind; + +/** + */ +public class VectorMapJoinOptimizedCreateHashTable { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinOptimizedCreateHashTable.class.getName()); + + public static VectorMapJoinOptimizedHashTable createHashTable(MapJoinDesc desc, + MapJoinTableContainer mapJoinTableContainer) { + + MapJoinKey refKey = mapJoinTableContainer.getAnyKey(); + ReusableGetAdaptor hashMapRowGetter = mapJoinTableContainer.createGetter(refKey); + + boolean isOuterJoin = !desc.isNoOuterJoin(); + VectorMapJoinDesc vectorDesc = desc.getVectorDesc(); + HashTableKind hashTableKind = vectorDesc.hashTableKind(); + HashTableKeyType hashTableKeyType = vectorDesc.hashTableKeyType(); + boolean minMaxEnabled = vectorDesc.minMaxEnabled(); + + VectorMapJoinOptimizedHashTable hashTable = null; + + switch (hashTableKeyType) { + case BOOLEAN: + case BYTE: + case SHORT: + case INT: + case LONG: + switch (hashTableKind) { + case HASH_MAP: + hashTable = new VectorMapJoinOptimizedLongHashMap( + minMaxEnabled, isOuterJoin, hashTableKeyType, + mapJoinTableContainer, hashMapRowGetter); + break; + case HASH_MULTISET: + hashTable = new VectorMapJoinOptimizedLongHashMultiSet( + minMaxEnabled, isOuterJoin, hashTableKeyType, + mapJoinTableContainer, hashMapRowGetter); + break; + case HASH_SET: + hashTable = new VectorMapJoinOptimizedLongHashSet( + minMaxEnabled, isOuterJoin, hashTableKeyType, + mapJoinTableContainer, hashMapRowGetter); + break; + } + break; + + case STRING: + switch (hashTableKind) { + case HASH_MAP: + hashTable = new VectorMapJoinOptimizedStringHashMap( + isOuterJoin, + mapJoinTableContainer, hashMapRowGetter); + break; + case HASH_MULTISET: + hashTable = new VectorMapJoinOptimizedStringHashMultiSet( + isOuterJoin, + mapJoinTableContainer, hashMapRowGetter); + break; + case HASH_SET: + hashTable = new VectorMapJoinOptimizedStringHashSet( + isOuterJoin, + mapJoinTableContainer, hashMapRowGetter); + break; + } + break; + + case MULTI_KEY: + switch (hashTableKind) { + case HASH_MAP: + hashTable = new VectorMapJoinOptimizedMultiKeyHashMap( + isOuterJoin, + mapJoinTableContainer, hashMapRowGetter); + break; + case HASH_MULTISET: + hashTable = new VectorMapJoinOptimizedMultiKeyHashMultiSet( + isOuterJoin, + mapJoinTableContainer, hashMapRowGetter); + break; + case HASH_SET: + hashTable = new VectorMapJoinOptimizedMultiKeyHashSet( + isOuterJoin, + mapJoinTableContainer, hashMapRowGetter); + break; + } + break; + } + return hashTable; + } + + /* + @Override + public com.esotericsoftware.kryo.io.Output getHybridBigTableSpillOutput(int partitionId) { + + HybridHashTableContainer ht = (HybridHashTableContainer) mapJoinTableContainer; + + HashPartition hp = ht.getHashPartitions()[partitionId]; + + return hp.getMatchfileOutput(); + } + */ +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashMap.java new file mode 100644 index 0000000..e56c821 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashMap.java @@ -0,0 +1,128 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.persistence.BytesBytesMultiHashMap; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.serde2.WriteBuffers.ByteSegmentRef; + +public class VectorMapJoinOptimizedHashMap + extends VectorMapJoinOptimizedHashTable + implements VectorMapJoinBytesHashMap { + + @Override + public VectorMapJoinHashMapResult createHashMapResult() { + return new HashMapResult(); + } + + public static class HashMapResult extends VectorMapJoinHashMapResult { + + private BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult; + + public HashMapResult() { + super(); + bytesBytesMultiHashMapResult = new BytesBytesMultiHashMap.Result(); + } + + public BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult() { + return bytesBytesMultiHashMapResult; + } + + @Override + public boolean hasRows() { + return (joinResult() == JoinUtil.JoinResult.MATCH); + } + + @Override + public boolean isSingleRow() { + if (joinResult() != JoinUtil.JoinResult.MATCH) { + throw new RuntimeException("HashMapResult is not a match"); + } + return bytesBytesMultiHashMapResult.isSingleRow(); + } + + @Override + public boolean isCappedCountAvailable() { + return false; + } + + @Override + public int cappedCount() { + return 0; + } + + @Override + public ByteSegmentRef first() { + if (joinResult() != JoinUtil.JoinResult.MATCH) { + throw new RuntimeException("HashMapResult is not a match"); + } + return bytesBytesMultiHashMapResult.first(); + } + + @Override + public ByteSegmentRef next() { + return bytesBytesMultiHashMapResult.next(); + } + + @Override + public boolean isEof() { + return bytesBytesMultiHashMapResult.isEof(); + } + + @Override + public void forget() { + bytesBytesMultiHashMapResult.forget(); + super.forget(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("(" + super.toString() + ", "); + sb.append("isSingleRow " + (joinResult() == JoinUtil.JoinResult.MATCH ? isSingleRow() : "") + ")"); + return sb.toString(); + } + } + + @Override + public JoinUtil.JoinResult lookup(byte[] keyBytes, int keyOffset, int keyLength, + VectorMapJoinHashMapResult hashMapResult) throws IOException { + + HashMapResult implementationHashMapResult = (HashMapResult) hashMapResult; + + JoinUtil.JoinResult joinResult = + doLookup(keyBytes, keyOffset, keyLength, + implementationHashMapResult.bytesBytesMultiHashMapResult(), + (VectorMapJoinHashTableResult) hashMapResult); + + return joinResult; + } + + public VectorMapJoinOptimizedHashMap( + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashMultiSet.java new file mode 100644 index 0000000..34de7e1 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashMultiSet.java @@ -0,0 +1,103 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.persistence.BytesBytesMultiHashMap; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMultiSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.serde2.WriteBuffers.ByteSegmentRef; + +public class VectorMapJoinOptimizedHashMultiSet + extends VectorMapJoinOptimizedHashTable + implements VectorMapJoinBytesHashMultiSet { + + @Override + public VectorMapJoinHashMultiSetResult createHashMultiSetResult() { + return new HashMultiSetResult(); + } + + public static class HashMultiSetResult extends VectorMapJoinHashMultiSetResult { + + private BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult; + + private boolean haveCount; + + public HashMultiSetResult() { + super(); + bytesBytesMultiHashMapResult = new BytesBytesMultiHashMap.Result(); + } + + public BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult() { + return bytesBytesMultiHashMapResult; + } + + /* + * @return The multi-set count for the lookup key. + */ + @Override + public long count() { + if (!haveCount) { + if (bytesBytesMultiHashMapResult.isSingleRow()) { + count = 1; + } else { + count = 0; + ByteSegmentRef byteSegmentRef = bytesBytesMultiHashMapResult.first(); + while (byteSegmentRef != null) { + count++; + byteSegmentRef = bytesBytesMultiHashMapResult.next(); + } + } + haveCount = true; + } + return count; + } + + @Override + public void forget() { + haveCount = false; + bytesBytesMultiHashMapResult.forget(); + super.forget(); + } + } + + @Override + public JoinUtil.JoinResult contains(byte[] keyBytes, int keyOffset, int keyLength, + VectorMapJoinHashMultiSetResult hashMultiSetResult) throws IOException { + + HashMultiSetResult implementationHashMultiSetResult = (HashMultiSetResult) hashMultiSetResult; + + JoinUtil.JoinResult joinResult = + doLookup(keyBytes, keyOffset, keyLength, + implementationHashMultiSetResult.bytesBytesMultiHashMapResult(), + (VectorMapJoinHashTableResult) hashMultiSetResult); + + return joinResult; + } + + public VectorMapJoinOptimizedHashMultiSet( + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashSet.java new file mode 100644 index 0000000..93a89d7 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashSet.java @@ -0,0 +1,78 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.persistence.BytesBytesMultiHashMap; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; + +public class VectorMapJoinOptimizedHashSet + extends VectorMapJoinOptimizedHashTable + implements VectorMapJoinBytesHashSet { + + @Override + public VectorMapJoinHashSetResult createHashSetResult() { + return new HashSetResult(); + } + + public static class HashSetResult extends VectorMapJoinHashSetResult { + + private BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult; + + public HashSetResult() { + super(); + bytesBytesMultiHashMapResult = new BytesBytesMultiHashMap.Result(); + } + + public BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult() { + return bytesBytesMultiHashMapResult; + } + + @Override + public void forget() { + bytesBytesMultiHashMapResult.forget(); + super.forget(); + } + } + + @Override + public JoinUtil.JoinResult contains(byte[] keyBytes, int keyOffset, int keyLength, + VectorMapJoinHashSetResult hashSetResult) throws IOException { + + HashSetResult implementationHashSetResult = (HashSetResult) hashSetResult; + + JoinUtil.JoinResult joinResult = + doLookup(keyBytes, keyOffset, keyLength, + implementationHashSetResult.bytesBytesMultiHashMapResult(), + (VectorMapJoinHashTableResult) hashSetResult); + + return joinResult; + } + + public VectorMapJoinOptimizedHashSet( + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashTable.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashTable.java new file mode 100644 index 0000000..a2d4e4c --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedHashTable.java @@ -0,0 +1,95 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.persistence.BytesBytesMultiHashMap; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainerDirectAccess; +import org.apache.hadoop.hive.ql.exec.persistence.ReusableGetAdaptorDirectAccess; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTable; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashTableResult; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.SerDeException; +import org.apache.hadoop.io.BytesWritable; +import org.apache.hadoop.io.Writable; + +/* + * Root interface for a vector map join hash table (which could be a hash map, hash multi-set, or + * hash set). + */ +public abstract class VectorMapJoinOptimizedHashTable implements VectorMapJoinHashTable { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinOptimizedMultiKeyHashMap.class.getName()); + + protected final MapJoinTableContainer originalTableContainer; + protected final MapJoinTableContainerDirectAccess containerDirectAccess; + protected final ReusableGetAdaptorDirectAccess adapatorDirectAccess; + + public static class SerializedBytes { + byte[] bytes; + int offset; + int length; + } + + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + putRowInternal(currentKey, currentValue); + } + + protected void putRowInternal(BytesWritable key, BytesWritable value) + throws SerDeException, HiveException, IOException { + + containerDirectAccess.put((Writable) key, (Writable) value); + } + + public JoinUtil.JoinResult doLookup(byte[] keyBytes, int keyOffset, int keyLength, + BytesBytesMultiHashMap.Result bytesBytesMultiHashMapResult, + VectorMapJoinHashTableResult hashTableResult) { + + hashTableResult.forget(); + + JoinUtil.JoinResult joinResult = + adapatorDirectAccess.setDirect(keyBytes, keyOffset, keyLength, + bytesBytesMultiHashMapResult); + if (joinResult == JoinUtil.JoinResult.SPILL) { + hashTableResult.setSpillPartitionId(adapatorDirectAccess.directSpillPartitionId()); + } + + hashTableResult.setJoinResult(joinResult); + + return joinResult; + } + + public VectorMapJoinOptimizedHashTable( + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + + this.originalTableContainer = originalTableContainer; + containerDirectAccess = (MapJoinTableContainerDirectAccess) originalTableContainer; + adapatorDirectAccess = (ReusableGetAdaptorDirectAccess) hashMapRowGetter; + } + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongCommon.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongCommon.java new file mode 100644 index 0000000..60825ce --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongCommon.java @@ -0,0 +1,171 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.optimized.VectorMapJoinOptimizedHashTable.SerializedBytes; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableSerializeWrite; + +/* + * An single long value hash map based on the BytesBytesMultiHashMap. + * + * We serialize the long key into BinarySortable format into an output buffer accepted by + * BytesBytesMultiHashMap. + */ +public class VectorMapJoinOptimizedLongCommon { + + private static final Log LOG = LogFactory.getLog(VectorMapJoinOptimizedLongCommon.class.getName()); + + private boolean isOuterJoin; + + private HashTableKeyType hashTableKeyType; + + // private BinarySortableDeserializeRead keyBinarySortableDeserializeRead; + + private BinarySortableSerializeWrite keyBinarySortableSerializeWrite; + + private transient Output output; + + private transient SerializedBytes serializedBytes; + + // protected boolean useMinMax; + protected long min; + protected long max; + + public boolean useMinMax() { + return false; + } + + public long min() { + return min; + } + + public long max() { + return max; + } + + /* + * For now, just use MapJoinBytesTableContainer / HybridHashTableContainer directly. + + public void adaptPutRow(VectorMapJoinOptimizedHashTable hashTable, + BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + if (useMinMax) { + // Peek at the BinarySortable key to extract the long so we can determine min and max. + byte[] keyBytes = currentKey.getBytes(); + int keyLength = currentKey.getLength(); + keyBinarySortableDeserializeRead.set(keyBytes, 0, keyLength); + if (keyBinarySortableDeserializeRead.readCheckNull()) { + if (isOuterJoin) { + return; + } else { + // For inner join, we expect all NULL values to have been filtered out before now. + throw new HiveException("Unexpected NULL"); + } + } + long key = 0; + switch (hashTableKeyType) { + case BOOLEAN: + key = (keyBinarySortableDeserializeRead.readBoolean() ? 1 : 0); + break; + case BYTE: + key = (long) keyBinarySortableDeserializeRead.readByte(); + break; + case SHORT: + key = (long) keyBinarySortableDeserializeRead.readShort(); + break; + case INT: + key = (long) keyBinarySortableDeserializeRead.readInt(); + break; + case LONG: + key = keyBinarySortableDeserializeRead.readLong(); + break; + default: + throw new RuntimeException("Unexpected hash table key type " + hashTableKeyType.name()); + } + if (key < min) { + min = key; + } + if (key > max) { + max = key; + } + + // byte[] bytes = Arrays.copyOf(currentKey.get(), currentKey.getLength()); + // LOG.info("VectorMapJoinOptimizedLongCommon adaptPutRow key " + key + " min " + min + " max " + max + " hashTableKeyType " + hashTableKeyType.name() + " hex " + Hex.encodeHexString(bytes)); + + } + + hashTable.putRowInternal(currentKey, currentValue); + } + */ + + public SerializedBytes serialize(long key) throws IOException { + keyBinarySortableSerializeWrite.reset(); + + switch (hashTableKeyType) { + case BOOLEAN: + keyBinarySortableSerializeWrite.writeBoolean(key == 1); + break; + case BYTE: + keyBinarySortableSerializeWrite.writeByte((byte) key); + break; + case SHORT: + keyBinarySortableSerializeWrite.writeShort((short) key); + break; + case INT: + keyBinarySortableSerializeWrite.writeInt((int) key); + break; + case LONG: + keyBinarySortableSerializeWrite.writeLong(key); + break; + default: + throw new RuntimeException("Unexpected hash table key type " + hashTableKeyType.name()); + } + + // byte[] bytes = Arrays.copyOf(output.getData(), output.getLength()); + // LOG.info("VectorMapJoinOptimizedLongCommon serialize key " + key + " hashTableKeyType " + hashTableKeyType.name() + " hex " + Hex.encodeHexString(bytes)); + + serializedBytes.bytes = output.getData(); + serializedBytes.offset = 0; + serializedBytes.length = output.getLength(); + + return serializedBytes; + } + + public VectorMapJoinOptimizedLongCommon( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType) { + this.isOuterJoin = isOuterJoin; + // useMinMax = minMaxEnabled; + min = Long.MAX_VALUE; + max = Long.MIN_VALUE; + this.hashTableKeyType = hashTableKeyType; + // PrimitiveTypeInfo[] primitiveTypeInfos = { TypeInfoFactory.longTypeInfo }; + // keyBinarySortableDeserializeRead = new BinarySortableDeserializeRead(primitiveTypeInfos); + keyBinarySortableSerializeWrite = new BinarySortableSerializeWrite(1); + output = new Output(); + keyBinarySortableSerializeWrite.set(output); + serializedBytes = new SerializedBytes(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashMap.java new file mode 100644 index 0000000..403d265 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashMap.java @@ -0,0 +1,82 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMap; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; + +/* + * An single long value hash map based on the BytesBytesMultiHashMap. + * + * We serialize the long key into BinarySortable format into an output buffer accepted by + * BytesBytesMultiHashMap. + */ +public class VectorMapJoinOptimizedLongHashMap + extends VectorMapJoinOptimizedHashMap + implements VectorMapJoinLongHashMap { + + private VectorMapJoinOptimizedLongCommon longCommon; + + @Override + public boolean useMinMax() { + return longCommon.useMinMax(); + } + + @Override + public long min() { + return longCommon.min(); + } + + @Override + public long max() { + return longCommon.max(); + } + + /* + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + longCommon.adaptPutRow((VectorMapJoinOptimizedHashTable) this, currentKey, currentValue); + } + */ + + @Override + public JoinResult lookup(long key, + VectorMapJoinHashMapResult hashMapResult) throws IOException { + + SerializedBytes serializedBytes = longCommon.serialize(key); + + return super.lookup(serializedBytes.bytes, serializedBytes.offset, serializedBytes.length, + hashMapResult); + } + + public VectorMapJoinOptimizedLongHashMap( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + longCommon = new VectorMapJoinOptimizedLongCommon(minMaxEnabled, isOuterJoin, hashTableKeyType); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashMultiSet.java new file mode 100644 index 0000000..5fb8c3a --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashMultiSet.java @@ -0,0 +1,83 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashMultiSet; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; + +/* + * An single long value hash map based on the BytesBytesMultiHashMultiSet. + * + * We serialize the long key into BinarySortable format into an output buffer accepted by + * BytesBytesMultiHashMultiSet. + */ +public class VectorMapJoinOptimizedLongHashMultiSet + extends VectorMapJoinOptimizedHashMultiSet + implements VectorMapJoinLongHashMultiSet { + + private VectorMapJoinOptimizedLongCommon longCommon; + + @Override + public boolean useMinMax() { + return longCommon.useMinMax(); + } + + @Override + public long min() { + return longCommon.min(); + } + + @Override + public long max() { + return longCommon.max(); + } + + /* + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + longCommon.adaptPutRow((VectorMapJoinOptimizedHashTable) this, currentKey, currentValue); + } + */ + + @Override + public JoinResult contains(long key, + VectorMapJoinHashMultiSetResult hashMultiSetResult) throws IOException { + + SerializedBytes serializedBytes = longCommon.serialize(key); + + return super.contains(serializedBytes.bytes, serializedBytes.offset, serializedBytes.length, + hashMultiSetResult); + + } + + public VectorMapJoinOptimizedLongHashMultiSet( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + longCommon = new VectorMapJoinOptimizedLongCommon(minMaxEnabled, isOuterJoin, hashTableKeyType); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashSet.java new file mode 100644 index 0000000..c41505a --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedLongHashSet.java @@ -0,0 +1,83 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinLongHashSet; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; + +/* + * An single long value hash map based on the BytesBytesMultiHashSet. + * + * We serialize the long key into BinarySortable format into an output buffer accepted by + * BytesBytesMultiHashSet. + */ +public class VectorMapJoinOptimizedLongHashSet + extends VectorMapJoinOptimizedHashSet + implements VectorMapJoinLongHashSet { + + private VectorMapJoinOptimizedLongCommon longCommon; + + @Override + public boolean useMinMax() { + return longCommon.useMinMax(); + } + + @Override + public long min() { + return longCommon.min(); + } + + @Override + public long max() { + return longCommon.max(); + } + + /* + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + longCommon.adaptPutRow((VectorMapJoinOptimizedHashTable) this, currentKey, currentValue); + } + */ + + @Override + public JoinResult contains(long key, + VectorMapJoinHashSetResult hashSetResult) throws IOException { + + SerializedBytes serializedBytes = longCommon.serialize(key); + + return super.contains(serializedBytes.bytes, serializedBytes.offset, serializedBytes.length, + hashSetResult); + + } + + public VectorMapJoinOptimizedLongHashSet( + boolean minMaxEnabled, boolean isOuterJoin, HashTableKeyType hashTableKeyType, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + longCommon = new VectorMapJoinOptimizedLongCommon(minMaxEnabled, isOuterJoin, hashTableKeyType); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashMap.java new file mode 100644 index 0000000..4f3e20e --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashMap.java @@ -0,0 +1,36 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; + +/* + * An multi-key hash map based on the BytesBytesMultiHashMap. + */ +public class VectorMapJoinOptimizedMultiKeyHashMap + extends VectorMapJoinOptimizedHashMap { + + // UNDONE: How to look for all NULLs in a multi-key????? Let nulls through for now. + + public VectorMapJoinOptimizedMultiKeyHashMap(boolean isOuterJoin, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashMultiSet.java new file mode 100644 index 0000000..b95a2dd --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashMultiSet.java @@ -0,0 +1,36 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; + +/* + * An multi-key hash map based on the BytesBytesMultiHashMultiSet. + */ +public class VectorMapJoinOptimizedMultiKeyHashMultiSet + extends VectorMapJoinOptimizedHashMultiSet { + + // UNDONE: How to look for all NULLs in a multi-key????? Let nulls through for now. + + public VectorMapJoinOptimizedMultiKeyHashMultiSet(boolean isOuterJoin, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashSet.java new file mode 100644 index 0000000..35ecc2a --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedMultiKeyHashSet.java @@ -0,0 +1,36 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; + +/* + * An multi-key hash map based on the BytesBytesMultiHashSet. + */ +public class VectorMapJoinOptimizedMultiKeyHashSet + extends VectorMapJoinOptimizedHashSet { + + // UNDONE: How to look for all NULLs in a multi-key????? Let nulls through for now. + + public VectorMapJoinOptimizedMultiKeyHashSet(boolean isOuterJoin, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringCommon.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringCommon.java new file mode 100644 index 0000000..39c2d49 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringCommon.java @@ -0,0 +1,98 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.optimized.VectorMapJoinOptimizedHashTable.SerializedBytes; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.apache.hadoop.hive.serde2.binarysortable.fast.BinarySortableSerializeWrite; + +/* + * An single byte array value hash map based on the BytesBytesMultiHashMap. + * + * Since BytesBytesMultiHashMap does not interpret the key as BinarySortable we optimize + * this case and just reference the byte array key directly for the lookup instead of serializing + * the byte array into BinarySortable. We rely on it just doing byte array equality comparisons. + */ +public class VectorMapJoinOptimizedStringCommon { + + // private boolean isOuterJoin; + + // private BinarySortableDeserializeRead keyBinarySortableDeserializeRead; + + // private ReadStringResults readStringResults; + + private BinarySortableSerializeWrite keyBinarySortableSerializeWrite; + + private transient Output output; + + private transient SerializedBytes serializedBytes; + + /* + private BytesWritable bytesWritable; + + public void adaptPutRow(VectorMapJoinOptimizedHashTable hashTable, + BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + byte[] keyBytes = currentKey.getBytes(); + int keyLength = currentKey.getLength(); + keyBinarySortableDeserializeRead.set(keyBytes, 0, keyLength); + if (keyBinarySortableDeserializeRead.readCheckNull()) { + if (isOuterJoin) { + return; + } else { + // For inner join, we expect all NULL values to have been filtered out before now. + throw new HiveException("Unexpected NULL"); + } + } + keyBinarySortableDeserializeRead.readString(readStringResults); + + bytesWritable.set(readStringResults.bytes, readStringResults.start, readStringResults.length); + + hashTable.putRowInternal(bytesWritable, currentValue); + } + */ + + public SerializedBytes serialize(byte[] keyBytes, int keyStart, int keyLength) throws IOException { + + keyBinarySortableSerializeWrite.reset(); + keyBinarySortableSerializeWrite.writeString(keyBytes, keyStart, keyLength); + + serializedBytes.bytes = output.getData(); + serializedBytes.offset = 0; + serializedBytes.length = output.getLength(); + + return serializedBytes; + + } + + public VectorMapJoinOptimizedStringCommon(boolean isOuterJoin) { + // this.isOuterJoin = isOuterJoin; + // PrimitiveTypeInfo[] primitiveTypeInfos = { TypeInfoFactory.stringTypeInfo }; + // keyBinarySortableDeserializeRead = new BinarySortableDeserializeRead(primitiveTypeInfos); + // readStringResults = keyBinarySortableDeserializeRead.createReadStringResults(); + // bytesWritable = new BytesWritable(); + keyBinarySortableSerializeWrite = new BinarySortableSerializeWrite(1); + output = new Output(); + keyBinarySortableSerializeWrite.set(output); + serializedBytes = new SerializedBytes(); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashMap.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashMap.java new file mode 100644 index 0000000..220c05e --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashMap.java @@ -0,0 +1,63 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMap; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; + +/* + * An multi-key hash map based on the BytesBytesMultiHashMap. + */ +public class VectorMapJoinOptimizedStringHashMap + extends VectorMapJoinOptimizedHashMap + implements VectorMapJoinBytesHashMap { + + private VectorMapJoinOptimizedStringCommon stringCommon; + + /* + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + stringCommon.adaptPutRow((VectorMapJoinOptimizedHashTable) this, currentKey, currentValue); + } + */ + + @Override + public JoinResult lookup(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashMapResult hashMapResult) throws IOException { + + SerializedBytes serializedBytes = stringCommon.serialize(keyBytes, keyStart, keyLength); + + return super.lookup(serializedBytes.bytes, serializedBytes.offset, serializedBytes.length, + hashMapResult); + + } + + public VectorMapJoinOptimizedStringHashMap(boolean isOuterJoin, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + stringCommon = new VectorMapJoinOptimizedStringCommon(isOuterJoin); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashMultiSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashMultiSet.java new file mode 100644 index 0000000..b6c6958 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashMultiSet.java @@ -0,0 +1,64 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashMultiSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMultiSetResult; + +/* + * An multi-key hash map based on the BytesBytesMultiHashMultiSet. + */ +public class VectorMapJoinOptimizedStringHashMultiSet + extends VectorMapJoinOptimizedHashMultiSet + implements VectorMapJoinBytesHashMultiSet { + + private VectorMapJoinOptimizedStringCommon stringCommon; + + /* + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + stringCommon.adaptPutRow((VectorMapJoinOptimizedHashTable) this, currentKey, currentValue); + } + */ + + @Override + public JoinResult contains(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashMultiSetResult hashMultiSetResult) throws IOException { + + SerializedBytes serializedBytes = stringCommon.serialize(keyBytes, keyStart, keyLength); + + return super.contains(serializedBytes.bytes, serializedBytes.offset, serializedBytes.length, + hashMultiSetResult); + + + } + + public VectorMapJoinOptimizedStringHashMultiSet(boolean isOuterJoin, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + stringCommon = new VectorMapJoinOptimizedStringCommon(isOuterJoin); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashSet.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashSet.java new file mode 100644 index 0000000..f921b9c --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/mapjoin/optimized/VectorMapJoinOptimizedStringHashSet.java @@ -0,0 +1,63 @@ +/** + * 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.exec.vector.mapjoin.optimized; + +import java.io.IOException; + +import org.apache.hadoop.hive.ql.exec.JoinUtil.JoinResult; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinTableContainer.ReusableGetAdaptor; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinBytesHashSet; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashSetResult; + +/* + * An multi-key hash map based on the BytesBytesMultiHashSet. + */ +public class VectorMapJoinOptimizedStringHashSet + extends VectorMapJoinOptimizedHashSet + implements VectorMapJoinBytesHashSet { + + private VectorMapJoinOptimizedStringCommon stringCommon; + + /* + @Override + public void putRow(BytesWritable currentKey, BytesWritable currentValue) + throws SerDeException, HiveException, IOException { + + stringCommon.adaptPutRow((VectorMapJoinOptimizedHashTable) this, currentKey, currentValue); + } + */ + + @Override + public JoinResult contains(byte[] keyBytes, int keyStart, int keyLength, + VectorMapJoinHashSetResult hashSetResult) throws IOException { + + SerializedBytes serializedBytes = stringCommon.serialize(keyBytes, keyStart, keyLength); + + return super.contains(serializedBytes.bytes, serializedBytes.offset, serializedBytes.length, + hashSetResult); + + } + + public VectorMapJoinOptimizedStringHashSet(boolean isOuterJoin, + MapJoinTableContainer originalTableContainer, ReusableGetAdaptor hashMapRowGetter) { + super(originalTableContainer, hashMapRowGetter); + stringCommon = new VectorMapJoinOptimizedStringCommon(isOuterJoin); + } +} \ No newline at end of file diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java index 319aacb..615fd8a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java @@ -21,7 +21,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -30,7 +29,6 @@ import java.util.Properties; import java.util.Set; import java.util.Stack; -import java.util.TreeMap; import java.util.regex.Pattern; import org.apache.commons.logging.Log; @@ -39,10 +37,23 @@ import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants; import org.apache.hadoop.hive.ql.exec.*; import org.apache.hadoop.hive.ql.exec.mr.MapRedTask; +import org.apache.hadoop.hive.ql.exec.persistence.MapJoinKey; import org.apache.hadoop.hive.ql.exec.spark.SparkTask; import org.apache.hadoop.hive.ql.exec.tez.TezTask; import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor; import org.apache.hadoop.hive.ql.exec.vector.VectorGroupByOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinInnerBigOnlyLongOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinInnerBigOnlyMultiKeyOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinInnerBigOnlyStringOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinInnerLongOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinInnerMultiKeyOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinInnerStringOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinLeftSemiLongOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinLeftSemiMultiKeyOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinLeftSemiStringOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinOuterLongOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinOuterMultiKeyOperator; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinOuterStringOperator; import org.apache.hadoop.hive.ql.exec.vector.VectorizationContext; import org.apache.hadoop.hive.ql.exec.vector.VectorizationContextRegion; import org.apache.hadoop.hive.ql.exec.vector.VectorizedInputFormatInterface; @@ -68,6 +79,7 @@ import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.plan.GroupByDesc; +import org.apache.hadoop.hive.ql.plan.JoinDesc; import org.apache.hadoop.hive.ql.plan.MapJoinDesc; import org.apache.hadoop.hive.ql.plan.MapWork; import org.apache.hadoop.hive.ql.plan.OperatorDesc; @@ -78,6 +90,10 @@ import org.apache.hadoop.hive.ql.plan.TableScanDesc; import org.apache.hadoop.hive.ql.plan.TezWork; import org.apache.hadoop.hive.ql.plan.VectorGroupByDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableImplementationType; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKind; import org.apache.hadoop.hive.ql.plan.api.OperatorType; import org.apache.hadoop.hive.ql.udf.UDFAcos; import org.apache.hadoop.hive.ql.udf.UDFAsin; @@ -313,7 +329,7 @@ public Object dispatch(Node nd, Stack stack, Object... nodeOutputs) // We are only vectorizing Reduce under Tez. if (HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVE_VECTORIZATION_REDUCE_ENABLED)) { - convertReduceWork((ReduceWork) w); + convertReduceWork((ReduceWork) w, true); } } } @@ -325,7 +341,7 @@ public Object dispatch(Node nd, Stack stack, Object... nodeOutputs) } else if (baseWork instanceof ReduceWork && HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVE_VECTORIZATION_REDUCE_ENABLED)) { - convertReduceWork((ReduceWork) baseWork); + convertReduceWork((ReduceWork) baseWork, false); } } } @@ -335,7 +351,7 @@ public Object dispatch(Node nd, Stack stack, Object... nodeOutputs) private void convertMapWork(MapWork mapWork, boolean isTez) throws SemanticException { boolean ret = validateMapWork(mapWork, isTez); if (ret) { - vectorizeMapWork(mapWork); + vectorizeMapWork(mapWork, isTez); } } @@ -391,11 +407,11 @@ private boolean validateMapWork(MapWork mapWork, boolean isTez) throws SemanticE return true; } - private void vectorizeMapWork(MapWork mapWork) throws SemanticException { + private void vectorizeMapWork(MapWork mapWork, boolean isTez) throws SemanticException { LOG.info("Vectorizing MapWork..."); mapWork.setVectorMode(true); Map opRules = new LinkedHashMap(); - MapWorkVectorizationNodeProcessor vnp = new MapWorkVectorizationNodeProcessor(mapWork); + MapWorkVectorizationNodeProcessor vnp = new MapWorkVectorizationNodeProcessor(mapWork, isTez); addMapWorkRules(opRules, vnp); Dispatcher disp = new DefaultRuleDispatcher(vnp, opRules, null); GraphWalker ogw = new PreOrderWalker(disp); @@ -416,10 +432,10 @@ private void vectorizeMapWork(MapWork mapWork) throws SemanticException { return; } - private void convertReduceWork(ReduceWork reduceWork) throws SemanticException { + private void convertReduceWork(ReduceWork reduceWork, boolean isTez) throws SemanticException { boolean ret = validateReduceWork(reduceWork); if (ret) { - vectorizeReduceWork(reduceWork); + vectorizeReduceWork(reduceWork, isTez); } } @@ -497,7 +513,7 @@ private boolean validateReduceWork(ReduceWork reduceWork) throws SemanticExcepti return true; } - private void vectorizeReduceWork(ReduceWork reduceWork) throws SemanticException { + private void vectorizeReduceWork(ReduceWork reduceWork, boolean isTez) throws SemanticException { LOG.info("Vectorizing ReduceWork..."); reduceWork.setVectorMode(true); @@ -506,7 +522,7 @@ private void vectorizeReduceWork(ReduceWork reduceWork) throws SemanticException // VectorizationContext... Do we use PreOrderWalker instead of DefaultGraphWalker. Map opRules = new LinkedHashMap(); ReduceWorkVectorizationNodeProcessor vnp = - new ReduceWorkVectorizationNodeProcessor(reduceColumnNames, reduceTypeInfos); + new ReduceWorkVectorizationNodeProcessor(reduceColumnNames, reduceTypeInfos, isTez); addReduceWorkRules(opRules, vnp); Dispatcher disp = new DefaultRuleDispatcher(vnp, opRules, null); GraphWalker ogw = new PreOrderWalker(disp); @@ -645,11 +661,11 @@ public VectorizationContext walkStackToFindVectorizationContext(Stack stac } public Operator doVectorize(Operator op, - VectorizationContext vContext) throws SemanticException { + VectorizationContext vContext, boolean isTez) throws SemanticException { Operator vectorOp = op; try { if (!opsDone.contains(op)) { - vectorOp = vectorizeOperator(op, vContext); + vectorOp = vectorizeOperator(op, vContext, isTez); opsDone.add(op); if (vectorOp != op) { opToVectorOpMap.put(op, vectorOp); @@ -672,10 +688,12 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, class MapWorkVectorizationNodeProcessor extends VectorizationNodeProcessor { private final MapWork mWork; + private final boolean isTez; - public MapWorkVectorizationNodeProcessor(MapWork mWork) { + public MapWorkVectorizationNodeProcessor(MapWork mWork, boolean isTez) { super(); this.mWork = mWork; + this.isTez = isTez; } @Override @@ -714,7 +732,7 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, return null; } - Operator vectorOp = doVectorize(op, vContext); + Operator vectorOp = doVectorize(op, vContext, isTez); if (LOG.isDebugEnabled()) { if (vectorOp instanceof VectorizationContextRegion) { @@ -733,6 +751,8 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, private final List reduceColumnNames; private final List reduceTypeInfos; + private boolean isTez; + private Operator rootVectorOp; public Operator getRootVectorOp() { @@ -740,11 +760,12 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, } public ReduceWorkVectorizationNodeProcessor(List reduceColumnNames, - List reduceTypeInfos) { + List reduceTypeInfos, boolean isTez) { super(); this.reduceColumnNames = reduceColumnNames; this.reduceTypeInfos = reduceTypeInfos; rootVectorOp = null; + this.isTez = isTez; } @Override @@ -795,7 +816,7 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, return null; } - Operator vectorOp = doVectorize(op, vContext); + Operator vectorOp = doVectorize(op, vContext, isTez); if (LOG.isDebugEnabled()) { if (vectorOp instanceof VectorizationContextRegion) { @@ -1304,12 +1325,278 @@ private void fixupParentChildOperators(Operator op, } } + private boolean isBigTableOnlyResults(MapJoinDesc desc) { + Byte[] order = desc.getTagOrder(); + byte posBigTable = (byte) desc.getPosBigTable(); + Byte posSingleVectorMapJoinSmallTable = (order[0] == posBigTable ? order[1] : order[0]); + + int[] smallTableIndices; + int smallTableIndicesSize; + List smallTableExprs = desc.getExprs().get(posSingleVectorMapJoinSmallTable); + if (desc.getValueIndices() != null && desc.getValueIndices().get(posSingleVectorMapJoinSmallTable) != null) { + smallTableIndices = desc.getValueIndices().get(posSingleVectorMapJoinSmallTable); + LOG.info("Vectorizer isBigTableOnlyResults smallTableIndices " + Arrays.toString(smallTableIndices)); + smallTableIndicesSize = smallTableIndices.length; + } else { + smallTableIndices = null; + LOG.info("Vectorizer isBigTableOnlyResults smallTableIndices EMPTY"); + smallTableIndicesSize = 0; + } + + List smallTableRetainList = desc.getRetainList().get(posSingleVectorMapJoinSmallTable); + LOG.info("Vectorizer isBigTableOnlyResults smallTableRetainList " + smallTableRetainList); + int smallTableRetainSize = smallTableRetainList.size(); + + if (smallTableIndicesSize > 0) { + // Small table indices has priority over retain. + for (int i = 0; i < smallTableIndicesSize; i++) { + if (smallTableIndices[i] < 0) { + // Negative numbers indicate a column to be (deserialize) read from the small table's + // LazyBinary value row. + LOG.info("Vectorizer isBigTableOnlyResults smallTableIndices[i] < 0 returning false"); + return false; + } + } + } else if (smallTableRetainSize > 0) { + LOG.info("Vectorizer isBigTableOnlyResults smallTableRetainSize > 0 returning false"); + return false; + } + + LOG.info("Vectorizer isBigTableOnlyResults returning true"); + return true; + } + + Operator specializeMapJoinOperator(Operator op, + VectorizationContext vContext, MapJoinDesc desc) throws HiveException { + Operator vectorOp = null; + Class> opClass = null; + + boolean isOuterJoin = !desc.getNoOuterJoin(); + + VectorMapJoinDesc.HashTableImplementationType hashTableImplementationType = HashTableImplementationType.NONE; + VectorMapJoinDesc.HashTableKind hashTableKind = HashTableKind.NONE; + VectorMapJoinDesc.HashTableKeyType hashTableKeyType = HashTableKeyType.NONE; + + if (HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_FAST_HASHTABLE_ENABLED)) { + hashTableImplementationType = HashTableImplementationType.FAST; + } else { + // Restrict to using BytesBytesMultiHashMap via MapJoinBytesTableContainer or + // HybridHashTableContainer. + hashTableImplementationType = HashTableImplementationType.OPTIMIZED; + } + + int joinType = desc.getConds()[0].getType(); + + boolean isInnerBigOnly = false; + if (joinType == JoinDesc.INNER_JOIN && isBigTableOnlyResults(desc)) { + isInnerBigOnly = true; + } + + // By default, we can always use the multi-key class. + hashTableKeyType = HashTableKeyType.MULTI_KEY; + + if (!HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_MULTIKEY_ONLY_ENABLED)) { + + // Look for single column optimization. + byte posBigTable = (byte) desc.getPosBigTable(); + Map> keyExprs = desc.getKeys(); + List bigTableKeyExprs = keyExprs.get(posBigTable); + if (bigTableKeyExprs.size() == 1) { + String typeName = bigTableKeyExprs.get(0).getTypeString(); + LOG.info("Vectorizer vectorizeOperator map join typeName " + typeName); + if (typeName.equals("boolean")) { + hashTableKeyType = HashTableKeyType.BOOLEAN; + } else if (typeName.equals("tinyint")) { + hashTableKeyType = HashTableKeyType.BYTE; + } else if (typeName.equals("smallint")) { + hashTableKeyType = HashTableKeyType.SHORT; + } else if (typeName.equals("int")) { + hashTableKeyType = HashTableKeyType.INT; + } else if (typeName.equals("bigint") || typeName.equals("long")) { + hashTableKeyType = HashTableKeyType.LONG; + } else if (VectorizationContext.isStringFamily(typeName)) { + hashTableKeyType = HashTableKeyType.STRING; + } + } + } + + switch (joinType) { + case JoinDesc.INNER_JOIN: + if (!isInnerBigOnly) { + hashTableKind = HashTableKind.HASH_MAP; + } else { + hashTableKind = HashTableKind.HASH_MULTISET; + } + break; + case JoinDesc.LEFT_OUTER_JOIN: + case JoinDesc.RIGHT_OUTER_JOIN: + hashTableKind = HashTableKind.HASH_MAP; + break; + case JoinDesc.LEFT_SEMI_JOIN: + hashTableKind = HashTableKind.HASH_SET; + break; + default: + throw new HiveException("Unknown join type " + joinType); + } + + LOG.info("Vectorizer vectorizeOperator map join hashTableKind " + hashTableKind.name() + " hashTableKeyType " + hashTableKeyType.name()); + + switch (hashTableKeyType) { + case BOOLEAN: + case BYTE: + case SHORT: + case INT: + case LONG: + switch (joinType) { + case JoinDesc.INNER_JOIN: + if (!isInnerBigOnly) { + opClass = VectorMapJoinInnerLongOperator.class; + } else { + opClass = VectorMapJoinInnerBigOnlyLongOperator.class; + } + break; + case JoinDesc.LEFT_OUTER_JOIN: + case JoinDesc.RIGHT_OUTER_JOIN: + opClass = VectorMapJoinOuterLongOperator.class; + break; + case JoinDesc.LEFT_SEMI_JOIN: + opClass = VectorMapJoinLeftSemiLongOperator.class; + break; + default: + throw new HiveException("Unknown join type " + joinType); + } + break; + case STRING: + switch (joinType) { + case JoinDesc.INNER_JOIN: + if (!isInnerBigOnly) { + opClass = VectorMapJoinInnerStringOperator.class; + } else { + opClass = VectorMapJoinInnerBigOnlyStringOperator.class; + } + break; + case JoinDesc.LEFT_OUTER_JOIN: + case JoinDesc.RIGHT_OUTER_JOIN: + opClass = VectorMapJoinOuterStringOperator.class; + break; + case JoinDesc.LEFT_SEMI_JOIN: + opClass = VectorMapJoinLeftSemiStringOperator.class; + break; + default: + throw new HiveException("Unknown join type " + joinType); + } + break; + case MULTI_KEY: + switch (joinType) { + case JoinDesc.INNER_JOIN: + if (!isInnerBigOnly) { + opClass = VectorMapJoinInnerMultiKeyOperator.class; + } else { + opClass = VectorMapJoinInnerBigOnlyMultiKeyOperator.class; + } + break; + case JoinDesc.LEFT_OUTER_JOIN: + case JoinDesc.RIGHT_OUTER_JOIN: + opClass = VectorMapJoinOuterMultiKeyOperator.class; + break; + case JoinDesc.LEFT_SEMI_JOIN: + opClass = VectorMapJoinLeftSemiMultiKeyOperator.class; + break; + default: + throw new HiveException("Unknown join type " + joinType); + } + break; + } + + vectorOp = OperatorFactory.getVectorOperator(opClass, op.getConf(), vContext); + LOG.info("Vectorizer vectorizeOperator map join class " + vectorOp.getClass().getSimpleName()); + + boolean minMaxEnabled = HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_MINMAX_ENABLED); + + VectorMapJoinDesc vectorDesc = desc.getVectorDesc(); + vectorDesc.setHashTableImplementationType(hashTableImplementationType); + vectorDesc.setHashTableKind(hashTableKind); + vectorDesc.setHashTableKeyType(hashTableKeyType); + vectorDesc.setMinMaxEnabled(minMaxEnabled); + return vectorOp; + } + + private boolean canSpecializeMapJoin(Operator op, MapJoinDesc desc, + boolean isTez) { + + boolean specialize = false; + + if (op instanceof MapJoinOperator && + HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_ENABLED)) { + + // Currently, only under Tez and non-N-way joins. + if (isTez && desc.getConds().length == 1) { + + // Ok, all basic restrictions satisfied so far... + specialize = true; + + if (!HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVE_VECTORIZATION_MAPJOIN_NATIVE_FAST_HASHTABLE_ENABLED)) { + + // We are using the optimized hash table we have further + // restrictions (using optimized and key type). + + if (!HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVEMAPJOINUSEOPTIMIZEDTABLE)) { + specialize = false; + } else { + byte posBigTable = (byte) desc.getPosBigTable(); + Map> keyExprs = desc.getKeys(); + List bigTableKeyExprs = keyExprs.get(posBigTable); + for (ExprNodeDesc exprNodeDesc : bigTableKeyExprs) { + String typeName = exprNodeDesc.getTypeString(); + if (!MapJoinKey.isSupportedField(typeName)) { + specialize = false; + break; + } + } + } + } else { + + // With the fast hash table implementation, we currently do not support + // Hybrid Grace Hash Join. + + if (HiveConf.getBoolVar(hiveConf, + HiveConf.ConfVars.HIVEUSEHYBRIDGRACEHASHJOIN)) { + specialize = false; + } + } + } + } + return specialize; + } + Operator vectorizeOperator(Operator op, - VectorizationContext vContext) throws HiveException { + VectorizationContext vContext, boolean isTez) throws HiveException { Operator vectorOp = null; switch (op.getType()) { case MAPJOIN: + { + MapJoinDesc desc = (MapJoinDesc) op.getConf(); + boolean specialize = canSpecializeMapJoin(op, desc, isTez); + + if (!specialize) { + vectorOp = OperatorFactory.getVectorOperator(desc, vContext); + } else { + + // TEMPORARY Until Native Vector Map Join with Hybrid passes tests... + // HiveConf.setBoolVar(physicalContext.getConf(), + // HiveConf.ConfVars.HIVEUSEHYBRIDGRACEHASHJOIN, false); + + vectorOp = specializeMapJoinOperator(op, vContext, desc); + } + } + break; case GROUPBY: case FILTER: case SELECT: @@ -1325,6 +1612,9 @@ private void fixupParentChildOperators(Operator op, break; } + LOG.info("vectorizeOperator " + (vectorOp == null ? "NULL" : vectorOp.getClass().getName())); + LOG.info("vectorizeOperator " + (vectorOp == null || vectorOp.getConf() == null ? "NULL" : vectorOp.getConf().getClass().getName())); + if (vectorOp != op) { fixupParentChildOperators(op, vectorOp); ((AbstractOperatorDesc) vectorOp.getConf()).setVectorMode(true); diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/BaseWork.java ql/src/java/org/apache/hadoop/hive/ql/plan/BaseWork.java index 4f9221e..a342738 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/BaseWork.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/BaseWork.java @@ -60,6 +60,7 @@ public BaseWork(String name) { private String name; // Vectorization. + protected Map vectorColumnNameMap; protected Map vectorColumnTypeMap; protected Map vectorScratchColumnTypeMap; diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java index c2c1b95..0192fb5 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java @@ -72,12 +72,17 @@ private boolean isHybridHashJoin; + // Extra parameters only for vectorization. + private VectorMapJoinDesc vectorDesc; + public MapJoinDesc() { + vectorDesc = new VectorMapJoinDesc(); bigTableBucketNumMapping = new LinkedHashMap(); } public MapJoinDesc(MapJoinDesc clone) { super(clone); + vectorDesc = new VectorMapJoinDesc(clone.vectorDesc); this.keys = clone.keys; this.keyTblDesc = clone.keyTblDesc; this.valueTblDescs = clone.valueTblDescs; @@ -102,6 +107,7 @@ public MapJoinDesc(final Map> keys, final int posBigTable, final JoinCondDesc[] conds, final Map> filters, boolean noOuterJoin, String dumpFilePrefix) { super(values, outputColumnNames, noOuterJoin, conds, filters, null); + vectorDesc = new VectorMapJoinDesc(); this.keys = keys; this.keyTblDesc = keyTblDesc; this.valueTblDescs = valueTblDescs; @@ -112,6 +118,14 @@ public MapJoinDesc(final Map> keys, initRetainExprList(); } + public void setVectorDesc(VectorMapJoinDesc vectorDesc) { + this.vectorDesc = vectorDesc; + } + + public VectorMapJoinDesc getVectorDesc() { + return vectorDesc; + } + private void initRetainExprList() { retainList = new HashMap>(); Set>> set = super.getExprs().entrySet(); diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/VectorMapJoinDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/VectorMapJoinDesc.java new file mode 100644 index 0000000..e1bf1f4 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/plan/VectorMapJoinDesc.java @@ -0,0 +1,107 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.plan; + +/** + * VectorGroupByDesc. + * + * Extra parameters beyond MapJoinDesc just for the vector map join operators. + * + * We don't extend MapJoinDesc because the base OperatorDesc doesn't support + * clone and adding it is a lot work for little gain. + */ +public class VectorMapJoinDesc extends AbstractVectorDesc { + + private static long serialVersionUID = 1L; + + public static enum HashTableImplementationType { + NONE, + OPTIMIZED, + FAST + } + + public static enum HashTableKind { + NONE, + HASH_SET, + HASH_MULTISET, + HASH_MAP + } + + public static enum HashTableKeyType { + NONE, + BOOLEAN, + BYTE, + SHORT, + INT, + LONG, + STRING, + MULTI_KEY + } + + private HashTableImplementationType hashTableImplementationType; + private HashTableKind hashTableKind; + private HashTableKeyType hashTableKeyType; + private boolean minMaxEnabled; + + public VectorMapJoinDesc() { + hashTableImplementationType = HashTableImplementationType.NONE; + hashTableKind = HashTableKind.NONE; + hashTableKeyType = HashTableKeyType.NONE; + minMaxEnabled = false; + } + + public VectorMapJoinDesc(VectorMapJoinDesc clone) { + this.hashTableImplementationType = clone.hashTableImplementationType; + this.hashTableKind = clone.hashTableKind; + this.hashTableKeyType = clone.hashTableKeyType; + this.minMaxEnabled = clone.minMaxEnabled; + } + + public HashTableImplementationType hashTableImplementationType() { + return hashTableImplementationType; + } + + public void setHashTableImplementationType(HashTableImplementationType hashTableImplementationType) { + this.hashTableImplementationType = hashTableImplementationType; + } + + public HashTableKind hashTableKind() { + return hashTableKind; + } + + public void setHashTableKind(HashTableKind hashTableKind) { + this.hashTableKind = hashTableKind; + } + + public HashTableKeyType hashTableKeyType() { + return hashTableKeyType; + } + + public void setHashTableKeyType(HashTableKeyType hashTableKeyType) { + this.hashTableKeyType = hashTableKeyType; + } + + public boolean minMaxEnabled() { + return minMaxEnabled; + } + + public void setMinMaxEnabled(boolean minMaxEnabled) { + this.minMaxEnabled = minMaxEnabled; + } +} diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/TestDebugDisplay.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/TestDebugDisplay.java new file mode 100644 index 0000000..2a4f409 --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/TestDebugDisplay.java @@ -0,0 +1,63 @@ +/** + * 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.exec.vector.mapjoin; + +import junit.framework.TestCase; + +/** + * Unit test for the vectorized conversion to and from row object[]. + */ +public class TestDebugDisplay extends TestCase { + + public void testDebugDisplay() throws Throwable { + + try { + String result; + int[] test0 = {}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test0, test0.length); + System.out.println(result); + int[] test1 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test1, test1.length); + System.out.println(result); + int[] test2 = {5}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test2, test2.length); + System.out.println(result); + int[] test3 = {4,4}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test3, test3.length); + System.out.println(result); + int[] test4 = {0,1,2,3,4,5,6,6,7,7,8}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test4, test4.length); + System.out.println(result); + int[] test5 = {0,0,1}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test5, test5.length); + System.out.println(result); + int[] test6 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test6, test6.length); + System.out.println(result); + int[] test7 = {4,2}; + result = VectorMapJoinGenerateResultOperator.intArrayToRangesString(test7, test7.length); + System.out.println(result); + + + } catch (Throwable e) { + e.printStackTrace(); + throw e; + } + } +} \ No newline at end of file diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/CommonFastHashTable.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/CommonFastHashTable.java new file mode 100644 index 0000000..c2375e0 --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/CommonFastHashTable.java @@ -0,0 +1,128 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.serde2.WriteBuffers; + +import static org.junit.Assert.*; + +public class CommonFastHashTable { + + protected static final float LOAD_FACTOR = 0.75f; + protected static final int CAPACITY = 8; + protected static final int WB_SIZE = 128; // Make sure we cross some buffer boundaries... + protected static final int MODERATE_WB_SIZE = 8 * 1024; + protected static final int MODERATE_CAPACITY = 512; + protected static final int LARGE_WB_SIZE = 1024 * 1024; + protected static final int LARGE_CAPACITY = 8388608; + protected static Random random; + + public static int generateLargeCount() { + int count = 0; + if (random.nextInt(100) != 0) { + switch (random.nextInt(5)) { + case 0: + count = 1; + break; + case 1: + count = 2; + break; + case 2: + count = 3; + case 3: + count = 4 + random.nextInt(7); + break; + case 4: + count = 10 + random.nextInt(90); + break; + default: + throw new Error("Missing case"); + } + } else { + switch (random.nextInt(3)) { + case 0: + count = 100 + random.nextInt(900); + break; + case 1: + count = 1000 + random.nextInt(9000); + break; + case 2: + count = 10000 + random.nextInt(90000); + break; + } + } + return count; + } + public static void verifyHashMapResult(VectorMapJoinHashMapResult hashMapResult, + RandomByteArrayStream randomByteArrayStream ) { + + List resultBytes = new ArrayList(); + int count = 0; + if (hashMapResult.hasRows()) { + WriteBuffers.ByteSegmentRef ref = hashMapResult.first(); + while (ref != null) { + count++; + byte[] bytes = ref.getBytes(); + int offset = (int) ref.getOffset(); + int length = ref.getLength(); + resultBytes.add(Arrays.copyOfRange(bytes, offset, offset + length)); + ref = hashMapResult.next(); + } + } else { + assertTrue(hashMapResult.isEof()); + } + if (randomByteArrayStream.size() != count) { + assertTrue(false); + } + + for (int i = 0; i < count; ++i) { + byte[] bytes = resultBytes.get(i); + if (!randomByteArrayStream.contains(bytes)) { + assertTrue(false); + } + } + } + + public static void verifyHashMapResult(VectorMapJoinHashMapResult hashMapResult, + byte[] valueBytes ) { + + assertTrue(hashMapResult.hasRows()); + WriteBuffers.ByteSegmentRef ref = hashMapResult.first(); + byte[] bytes = ref.getBytes(); + int offset = (int) ref.getOffset(); + int length = ref.getLength(); + assertTrue(valueBytes.length == length); + boolean match = true; // Assume + for (int j = 0; j < length; j++) { + if (valueBytes[j] != bytes[offset + j]) { + match = false; + break; + } + } + if (!match) { + assertTrue(false); + } + } +} \ No newline at end of file diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/RandomByteArrayStream.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/RandomByteArrayStream.java new file mode 100644 index 0000000..3960272 --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/RandomByteArrayStream.java @@ -0,0 +1,92 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomByteArrayStream { + + private Random random; + private int min; + + private List byteArrays; + + public RandomByteArrayStream(Random random) { + this.random = random; + byteArrays = new ArrayList(); + min = 1; + } + + public RandomByteArrayStream(Random random, int min) { + this.random = random; + byteArrays = new ArrayList(); + this.min = min; + } + + public byte[] next() { + int category = random.nextInt(100); + int count = 0; + if (category < 98) { + count = min + random.nextInt(10); + } else { + switch (category - 98) { + case 0: + count = Math.max(min, 10) + random.nextInt(90); + break; + case 1: + count = Math.max(min, 100) + random.nextInt(900); + } + } + byte[] bytes = new byte[count]; + random.nextBytes(bytes); + byteArrays.add(bytes); + return bytes; + } + + public int size() { + return byteArrays.size(); + } + + public byte[] get(int i) { + return byteArrays.get(i); + } + + public boolean contains(byte[] bytes) { + int length = bytes.length; + for (int i = 0; i < byteArrays.size(); i++) { + byte[] streamBytes = byteArrays.get(i); + if (streamBytes.length != length) { + continue; + } + boolean match = true; // Assume + for (int j = 0 ; j < length; j++) { + if (streamBytes[j] != bytes[j]) { + match = false; + break; + } + } + if (match) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/RandomLongStream.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/RandomLongStream.java new file mode 100644 index 0000000..eab5c21 --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/RandomLongStream.java @@ -0,0 +1,49 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class RandomLongStream { + + private Random random; + + private List longs; + + public RandomLongStream(Random random) { + this.random = random; + longs = new ArrayList(); + } + + public long next() { + long longValue = random.nextLong(); + longs.add(longValue); + return longValue; + } + + public int size() { + return longs.size(); + } + + public long get(int i) { + return longs.get(i); + } +} \ No newline at end of file diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinFastLongHashMap.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinFastLongHashMap.java new file mode 100644 index 0000000..eb38b19 --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinFastLongHashMap.java @@ -0,0 +1,219 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.util.Random; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.fast.VectorMapJoinFastLongHashMap; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestVectorMapJoinFastLongHashMap extends CommonFastHashTable { + + @Test + public void testPutGetOne() throws Exception { + random = new Random(47496); + + VectorMapJoinFastLongHashMap map = + new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, CAPACITY, LOAD_FACTOR, WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + long key = randomLongKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, randomByteArrayValueStream.get(0)); + + key = randomLongKeyStream.next(); + value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, randomByteArrayValueStream.get(1)); + } + + @Test + public void testPutGetMultiple() throws Exception { + random = new Random(2990); + + VectorMapJoinFastLongHashMap map = new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, CAPACITY, LOAD_FACTOR, WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + long key = randomLongKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, value); + + // Same key, multiple values. + for (int i = 0; i < 3; ++i) { + value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, randomByteArrayValueStream); + } + } + + @Test + public void testGetNonExistent() throws Exception { + random = new Random(16916); + + VectorMapJoinFastLongHashMap map = new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, CAPACITY, LOAD_FACTOR, WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + long key = randomLongKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + + key += 1; + map.putRow(key, value); + + key += 1; + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, hashMapResult); + assertTrue(joinResult == JoinUtil.JoinResult.NOMATCH); + assertTrue(!hashMapResult.hasRows()); + } + + @Test + public void testPutWithFullMap() throws Exception { + random = new Random(26078); + + // Make sure the map does not expand; should be able to find space. + VectorMapJoinFastLongHashMap map = new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, CAPACITY, 1f, WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + for (int i = 0; i < CAPACITY; ++i) { + long key = randomLongKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + } + for (int i = 0; i < randomLongKeyStream.size(); ++i) { + verifyHashMapResult(map, randomLongKeyStream.get(i), randomByteArrayValueStream.get(i)); + } + // assertEquals(CAPACITY, map.getCapacity()); + // Get of non-existent key should terminate.. + long anotherKey = randomLongKeyStream.next(); + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(anotherKey, hashMapResult); + assertTrue(joinResult == JoinUtil.JoinResult.NOMATCH); + } + + @Test + public void testExpand() throws Exception { + random = new Random(22470); + + // Start with capacity 1; make sure we expand on every put. + VectorMapJoinFastLongHashMap map = new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, 1, 0.0000001f, WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + for (int i = 0; i < 18; ++i) { + long key = randomLongKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + for (int j = 0; j <= i; ++j) { + verifyHashMapResult(map, randomLongKeyStream.get(j), randomByteArrayValueStream.get(j)); + } + } + // assertEquals(1 << 18, map.getCapacity()); + } + + @Test + public void testLarge() throws Exception { + random = new Random(40719); + + // Use a large capacity that doesn't require expansion, yet. + VectorMapJoinFastLongHashMap map = new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, LARGE_CAPACITY, LOAD_FACTOR, LARGE_WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + + final int largeSize = 1000; + RandomByteArrayStream[] randomByteArrayValueStreams = new RandomByteArrayStream[largeSize]; + for (int i = 0; i < largeSize; i++) { + randomByteArrayValueStreams[i] = new RandomByteArrayStream(random); + int count = generateLargeCount(); + long key = randomLongKeyStream.next(); + for (int v = 0; v < count; v++) { + byte[] value = randomByteArrayValueStreams[i].next(); + map.putRow(key, value); + } + } + for (int i = 0; i < largeSize; i++) { + verifyHashMapResult(map, randomLongKeyStream.get(i), randomByteArrayValueStreams[i]); + } + } + + @Test + public void testLargeAndExpand() throws Exception { + random = new Random(46809); + + // Use a large capacity that doesn't require expansion, yet. + VectorMapJoinFastLongHashMap map = new VectorMapJoinFastLongHashMap(false, false, HashTableKeyType.LONG, MODERATE_CAPACITY, LOAD_FACTOR, MODERATE_WB_SIZE, 0); + + RandomLongStream randomLongKeyStream = new RandomLongStream(random); + + final int largeSize = 1000; + RandomByteArrayStream[] randomByteArrayValueStreams = new RandomByteArrayStream[largeSize]; + for (int i = 0; i < largeSize; i++) { + randomByteArrayValueStreams[i] = new RandomByteArrayStream(random); + int count = generateLargeCount(); + long key = randomLongKeyStream.next(); + for (int v = 0; v < count; v++) { + byte[] value = randomByteArrayValueStreams[i].next(); + map.putRow(key, value); + } + } + for (int i = 0; i < largeSize; i++) { + verifyHashMapResult(map, randomLongKeyStream.get(i), randomByteArrayValueStreams[i]); + } + } + + private void verifyHashMapResult(VectorMapJoinFastLongHashMap map, long key, + RandomByteArrayStream randomByteArrayValueStream) { + + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, hashMapResult); + if (joinResult != JoinUtil.JoinResult.MATCH) { + assertTrue(false); + } + + CommonFastHashTable.verifyHashMapResult(hashMapResult, randomByteArrayValueStream); + } + + private void verifyHashMapResult(VectorMapJoinFastLongHashMap map, long key, + byte[] valueBytes) { + + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, hashMapResult); + if (joinResult != JoinUtil.JoinResult.MATCH) { + assertTrue(false); + } + + CommonFastHashTable.verifyHashMapResult(hashMapResult, valueBytes); + } + +} diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinFastMultiKeyHashMap.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinFastMultiKeyHashMap.java new file mode 100644 index 0000000..3c1b29a --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinFastMultiKeyHashMap.java @@ -0,0 +1,231 @@ +/** + * 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.exec.vector.mapjoin.fast; + +import java.util.Random; + +import org.apache.hadoop.hive.ql.exec.JoinUtil; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.hashtable.VectorMapJoinHashMapResult; +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.fast.VectorMapJoinFastMultiKeyHashMap; +import org.apache.hadoop.hive.ql.plan.VectorMapJoinDesc.HashTableKeyType; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestVectorMapJoinFastMultiKeyHashMap extends CommonFastHashTable { + + @Test + public void testPutGetOne() throws Exception { + random = new Random(47496); + + VectorMapJoinFastMultiKeyHashMap map = + new VectorMapJoinFastMultiKeyHashMap(false, CAPACITY, LOAD_FACTOR, WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + byte[] key = randomByteArrayKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, randomByteArrayValueStream.get(0)); + + key = randomByteArrayKeyStream.next(); + value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, randomByteArrayValueStream.get(1)); + } + + @Test + public void testPutGetMultiple() throws Exception { + random = new Random(2990); + + VectorMapJoinFastMultiKeyHashMap map = new VectorMapJoinFastMultiKeyHashMap(false, CAPACITY, LOAD_FACTOR, WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + byte[] key = randomByteArrayKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, value); + + // Same key, multiple values. + for (int i = 0; i < 3; ++i) { + value = randomByteArrayValueStream.next(); + map.putRow(key, value); + verifyHashMapResult(map, key, randomByteArrayValueStream); + } + } + + @Test + public void testGetNonExistent() throws Exception { + random = new Random(16916); + + VectorMapJoinFastMultiKeyHashMap map = new VectorMapJoinFastMultiKeyHashMap(false, CAPACITY, LOAD_FACTOR, WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + byte[] key = randomByteArrayKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + + key[0] = (byte) (key[0] + 1); + map.putRow(key, value); + + key[0] = (byte) (key[0] + 1); + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, 0, key.length, hashMapResult); + assertTrue(joinResult == JoinUtil.JoinResult.NOMATCH); + assertTrue(!hashMapResult.hasRows()); + } + + @Test + public void testPutWithFullMap() throws Exception { + random = new Random(26078); + + // Make sure the map does not expand; should be able to find space. + VectorMapJoinFastMultiKeyHashMap map = new VectorMapJoinFastMultiKeyHashMap(false, CAPACITY, 1f, WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + for (int i = 0; i < CAPACITY; ++i) { + byte[] key = randomByteArrayKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + } + for (int i = 0; i < randomByteArrayKeyStream.size(); ++i) { + verifyHashMapResult(map, randomByteArrayKeyStream.get(i), randomByteArrayValueStream.get(i)); + } + // assertEquals(CAPACITY, map.getCapacity()); + // Get of non-existent key should terminate.. + byte[] anotherKey = randomByteArrayKeyStream.next(); + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(anotherKey, 0, anotherKey.length, hashMapResult); + assertTrue(joinResult == JoinUtil.JoinResult.NOMATCH); + } + + @Test + public void testExpand() throws Exception { + random = new Random(22470); + + // Start with capacity 1; make sure we expand on every put. + VectorMapJoinFastMultiKeyHashMap map = new VectorMapJoinFastMultiKeyHashMap(false, 1, 0.0000001f, WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random); + RandomByteArrayStream randomByteArrayValueStream = new RandomByteArrayStream(random); + + for (int i = 0; i < 18; ++i) { + byte[] key = randomByteArrayKeyStream.next(); + byte[] value = randomByteArrayValueStream.next(); + map.putRow(key, value); + for (int j = 0; j <= i; ++j) { + verifyHashMapResult(map, randomByteArrayKeyStream.get(j), randomByteArrayValueStream.get(j)); + } + } + // assertEquals(1 << 18, map.getCapacity()); + } + + @Test + public void testLarge() throws Exception { + random = new Random(5231); + + // Use a large capacity that doesn't require expansion, yet. + VectorMapJoinFastMultiKeyHashMap map = new VectorMapJoinFastMultiKeyHashMap(false, LARGE_CAPACITY, LOAD_FACTOR, LARGE_WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random, 10); + + final int largeSize = 1000; + RandomByteArrayStream[] randomByteArrayValueStreams = new RandomByteArrayStream[largeSize]; + for (int i = 0; i < largeSize; i++) { + randomByteArrayValueStreams[i] = new RandomByteArrayStream(random); + int count = generateLargeCount(); + byte[] key = randomByteArrayKeyStream.next(); + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, 0, key.length, hashMapResult); + if (joinResult == JoinUtil.JoinResult.MATCH) { + // A problem or need different random seed / longer key? + assertTrue(false); + } + for (int v = 0; v < count; v++) { + byte[] value = randomByteArrayValueStreams[i].next(); + map.putRow(key, value); + } + } + for (int i = 0; i < largeSize; i++) { + verifyHashMapResult(map, randomByteArrayKeyStream.get(i), randomByteArrayValueStreams[i]); + } + } + + @Test + public void testLargeAndExpand() throws Exception { + random = new Random(46809); + + // Use a large capacity that doesn't require expansion, yet. + VectorMapJoinFastMultiKeyHashMap map = new VectorMapJoinFastMultiKeyHashMap(false, MODERATE_CAPACITY, LOAD_FACTOR, MODERATE_WB_SIZE, 0); + + RandomByteArrayStream randomByteArrayKeyStream = new RandomByteArrayStream(random, 10); + + final int largeSize = 1000; + RandomByteArrayStream[] randomByteArrayValueStreams = new RandomByteArrayStream[largeSize]; + for (int i = 0; i < largeSize; i++) { + randomByteArrayValueStreams[i] = new RandomByteArrayStream(random); + int count = generateLargeCount(); + byte[] key = randomByteArrayKeyStream.next(); + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, 0, key.length, hashMapResult); + if (joinResult == JoinUtil.JoinResult.MATCH) { + // A problem or need different random seed / longer key? + assertTrue(false); + } + for (int v = 0; v < count; v++) { + byte[] value = randomByteArrayValueStreams[i].next(); + map.putRow(key, value); + } + } + for (int i = 0; i < largeSize; i++) { + verifyHashMapResult(map, randomByteArrayKeyStream.get(i), randomByteArrayValueStreams[i]); + } + } + + private void verifyHashMapResult(VectorMapJoinFastMultiKeyHashMap map, byte[] key, + RandomByteArrayStream randomByteArrayValueStream) { + + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, 0, key.length, hashMapResult); + if (joinResult != JoinUtil.JoinResult.MATCH) { + assertTrue(false); + } + + CommonFastHashTable.verifyHashMapResult(hashMapResult, randomByteArrayValueStream); + } + + private void verifyHashMapResult(VectorMapJoinFastMultiKeyHashMap map, byte[] key, + byte[] valueBytes) { + + VectorMapJoinHashMapResult hashMapResult = map.createHashMapResult(); + JoinUtil.JoinResult joinResult = map.lookup(key, 0, key.length, hashMapResult); + if (joinResult != JoinUtil.JoinResult.MATCH) { + assertTrue(false); + } + + CommonFastHashTable.verifyHashMapResult(hashMapResult, valueBytes); + } + +} diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinRowBytesContainer.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinRowBytesContainer.java new file mode 100644 index 0000000..3c3aacd --- /dev/null +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/mapjoin/fast/TestVectorMapJoinRowBytesContainer.java @@ -0,0 +1,74 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.exec.vector.mapjoin.fast; + +import java.util.Random; + +import org.apache.hadoop.hive.ql.exec.vector.mapjoin.VectorMapJoinRowBytesContainer; +import org.apache.hadoop.hive.serde2.ByteStream.Output; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestVectorMapJoinRowBytesContainer { + + public void doFillReplay(Random random, int maxCount) throws Exception { + + RandomByteArrayStream randomByteArrayStream = new RandomByteArrayStream(random); + VectorMapJoinRowBytesContainer vectorMapJoinRowBytesContainer = new VectorMapJoinRowBytesContainer(); + + int count = Math.min(maxCount, random.nextInt(500)); + for (int i = 0; i < count; i++) { + byte[] bytes = randomByteArrayStream.next(); + Output output = vectorMapJoinRowBytesContainer.getOuputForRowBytes(); + output.write(bytes); + vectorMapJoinRowBytesContainer.finishRow(); + } + vectorMapJoinRowBytesContainer.prepareForReading(); + + for (int i = 0; i < count; i++) { + if (!vectorMapJoinRowBytesContainer.readNext()) { + assertTrue(false); + } + byte[] readBytes = vectorMapJoinRowBytesContainer.currentBytes(); + int readOffset = vectorMapJoinRowBytesContainer.currentOffset(); + int readLength = vectorMapJoinRowBytesContainer.currentLength(); + byte[] expectedBytes = randomByteArrayStream.get(i); + if (readLength != expectedBytes.length) { + assertTrue(false); + } + for (int j = 0; j < readLength; j++) { + byte readByte = readBytes[readOffset + j]; + byte expectedByte = expectedBytes[j]; + if (readByte != expectedByte) { + assertTrue(false); + } + } + } + } + + @Test + public void testFillReplay() throws Exception { + Random random = new Random(47496); + + for (int i = 0; i < 10; i++) { + doFillReplay(random, 1 << i); + } + } +} \ No newline at end of file diff --git ql/src/test/org/apache/hadoop/hive/ql/optimizer/physical/TestVectorizer.java ql/src/test/org/apache/hadoop/hive/ql/optimizer/physical/TestVectorizer.java index d12c137..f9a0e79 100644 --- ql/src/test/org/apache/hadoop/hive/ql/optimizer/physical/TestVectorizer.java +++ ql/src/test/org/apache/hadoop/hive/ql/optimizer/physical/TestVectorizer.java @@ -109,7 +109,7 @@ public void testAggregateOnUDF() throws HiveException { Vectorizer v = new Vectorizer(); Assert.assertTrue(v.validateMapWorkOperator(gbyOp, null, false)); - VectorGroupByOperator vectorOp = (VectorGroupByOperator) v.vectorizeOperator(gbyOp, vContext); + VectorGroupByOperator vectorOp = (VectorGroupByOperator) v.vectorizeOperator(gbyOp, vContext, false); Assert.assertEquals(VectorUDAFSumLong.class, vectorOp.getAggregators()[0].getClass()); VectorUDAFSumLong udaf = (VectorUDAFSumLong) vectorOp.getAggregators()[0]; Assert.assertEquals(FuncAbsLongToLong.class, udaf.getInputExpression().getClass()); diff --git ql/src/test/queries/clientpositive/vector_aggregate_9.q ql/src/test/queries/clientpositive/vector_aggregate_9.q index e085a2d..85bcc5a 100644 --- ql/src/test/queries/clientpositive/vector_aggregate_9.q +++ ql/src/test/queries/clientpositive/vector_aggregate_9.q @@ -40,4 +40,6 @@ INSERT INTO TABLE vectortab2korc SELECT * FROM vectortab2k; explain select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc; +-- SORT_QUERY_RESULTS + select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc; \ No newline at end of file diff --git ql/src/test/queries/clientpositive/vector_char_mapjoin1.q ql/src/test/queries/clientpositive/vector_char_mapjoin1.q index cb66674..76e9de8 100644 --- ql/src/test/queries/clientpositive/vector_char_mapjoin1.q +++ ql/src/test/queries/clientpositive/vector_char_mapjoin1.q @@ -36,14 +36,23 @@ create table char_join1_str_orc stored as orc as select * from char_join1_str; -- Join char with same length char explain select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1; + +-- SORT_QUERY_RESULTS + select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1; -- Join char with different length char explain select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1; + +-- SORT_QUERY_RESULTS + select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1; -- Join char with string explain select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1; + +-- SORT_QUERY_RESULTS + select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1; drop table char_join1_vc1; diff --git ql/src/test/queries/clientpositive/vector_decimal_mapjoin.q ql/src/test/queries/clientpositive/vector_decimal_mapjoin.q index f341a11..0c07b47 100644 --- ql/src/test/queries/clientpositive/vector_decimal_mapjoin.q +++ ql/src/test/queries/clientpositive/vector_decimal_mapjoin.q @@ -1,21 +1,32 @@ --- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc; - SET hive.auto.convert.join=true; SET hive.auto.convert.join.noconditionaltask=true; SET hive.auto.convert.join.noconditionaltask.size=1000000000; SET hive.vectorized.execution.enabled=true; -EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981; -SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981; +CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE; + +LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k; + +CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC; +INSERT INTO TABLE t1 select dec from over1k; +CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC; +INSERT INTO TABLE t2 select dec from over1k; + +explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec); + +-- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec); diff --git ql/src/test/queries/clientpositive/vector_inner_join.q ql/src/test/queries/clientpositive/vector_inner_join.q new file mode 100644 index 0000000..025b1a4 --- /dev/null +++ ql/src/test/queries/clientpositive/vector_inner_join.q @@ -0,0 +1,61 @@ +SET hive.vectorized.execution.enabled=true; +SET hive.auto.convert.join=true; + +CREATE TABLE orc_table_1a(a INT) STORED AS ORC; +CREATE TABLE orc_table_2a(c INT) STORED AS ORC; + +insert into table orc_table_1a values(1),(1), (2),(3); +insert into table orc_table_2a values(0),(2), (3),(null),(4); + +explain +select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2; + +select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2; + +explain +select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2; + +select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2; + + +CREATE TABLE orc_table_1b(v1 STRING, a INT) STORED AS ORC; +CREATE TABLE orc_table_2b(c INT, v2 STRING) STORED AS ORC; + +insert into table orc_table_1b values("one", 1),("one", 1), ("two", 2),("three", 3); +insert into table orc_table_2b values(0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"); + +explain +select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + + +explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +explain +select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +explain +select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +explain +select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2; + +explain +select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2; + +select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2; + +explain +select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2; + +select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2; diff --git ql/src/test/queries/clientpositive/vector_left_outer_join.q ql/src/test/queries/clientpositive/vector_left_outer_join.q index 6e96690..7c46c53 100644 --- ql/src/test/queries/clientpositive/vector_left_outer_join.q +++ ql/src/test/queries/clientpositive/vector_left_outer_join.q @@ -1,5 +1,6 @@ set hive.vectorized.execution.enabled=true; set hive.auto.convert.join=true; +set hive.mapjoin.hybridgrace.hashtable=false; explain select count(*) from (select c.ctinyint from alltypesorc c diff --git ql/src/test/queries/clientpositive/vector_mapjoin_reduce.q ql/src/test/queries/clientpositive/vector_mapjoin_reduce.q index 99aff3b..8bfa573 100644 --- ql/src/test/queries/clientpositive/vector_mapjoin_reduce.q +++ ql/src/test/queries/clientpositive/vector_mapjoin_reduce.q @@ -1,5 +1,6 @@ SET hive.vectorized.execution.enabled=true; SET hive.auto.convert.join=true; +set hive.mapjoin.hybridgrace.hashtable=false; -- SORT_QUERY_RESULTS diff --git ql/src/test/queries/clientpositive/vector_outer_join0.q ql/src/test/queries/clientpositive/vector_outer_join0.q new file mode 100644 index 0000000..95bdc41 --- /dev/null +++ ql/src/test/queries/clientpositive/vector_outer_join0.q @@ -0,0 +1,25 @@ +SET hive.vectorized.execution.enabled=true; +SET hive.auto.convert.join=true; + +CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC; +CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC; + +insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null); +insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, ""); + +select * from orc_table_1; +select * from orc_table_2; + +explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c; + +-- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c; + +explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c; + +-- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c; \ No newline at end of file diff --git ql/src/test/queries/clientpositive/vector_outer_join1.q ql/src/test/queries/clientpositive/vector_outer_join1.q new file mode 100644 index 0000000..a352cd7 --- /dev/null +++ ql/src/test/queries/clientpositive/vector_outer_join1.q @@ -0,0 +1,64 @@ +SET hive.vectorized.execution.enabled=true; +SET hive.auto.convert.join=true; + +create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5; +create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5; +create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5; +create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5; + +create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q; + +ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS; +ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS; + +explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint; + +-- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint; + +explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint; + +-- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint; + +explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1; + +-- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1; \ No newline at end of file diff --git ql/src/test/queries/clientpositive/vector_outer_join2.q ql/src/test/queries/clientpositive/vector_outer_join2.q new file mode 100644 index 0000000..76aa2fd --- /dev/null +++ ql/src/test/queries/clientpositive/vector_outer_join2.q @@ -0,0 +1,39 @@ +SET hive.vectorized.execution.enabled=true; +SET hive.auto.convert.join=true; +SET hive.vectorized.execution.mapjoin.native.enabled=true; + +create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5; +create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5; +create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5; +create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5; + +create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q; + +ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS; +ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS; + +explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1; + +-- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1; \ No newline at end of file diff --git ql/src/test/queries/clientpositive/vector_outer_join3.q ql/src/test/queries/clientpositive/vector_outer_join3.q new file mode 100644 index 0000000..81161cf --- /dev/null +++ ql/src/test/queries/clientpositive/vector_outer_join3.q @@ -0,0 +1,80 @@ +SET hive.vectorized.execution.enabled=true; +SET hive.auto.convert.join=true; +SET hive.vectorized.execution.mapjoin.native.enabled=true; + +create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5; +create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5; +create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5; +create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5; + +create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q; + +ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS; +ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS; + +explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +; + +-- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1; + +explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +; + +-- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1; + +explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +; + +-- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1; \ No newline at end of file diff --git ql/src/test/queries/clientpositive/vector_outer_join4.q ql/src/test/queries/clientpositive/vector_outer_join4.q new file mode 100644 index 0000000..fb9e6e4 --- /dev/null +++ ql/src/test/queries/clientpositive/vector_outer_join4.q @@ -0,0 +1,66 @@ +SET hive.vectorized.execution.enabled=true; +SET hive.auto.convert.join=true; +SET hive.vectorized.execution.mapjoin.native.enabled=true; + +create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10; +create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10; +create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10; +create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10; + +create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q; + +ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS; +ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS; + +explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint; + +-- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint; + +explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint; + +-- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint; + +explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +; + +-- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1; \ No newline at end of file diff --git ql/src/test/results/clientpositive/spark/vector_decimal_mapjoin.q.out ql/src/test/results/clientpositive/spark/vector_decimal_mapjoin.q.out index 5ec95c2..adaa1ad 100644 --- ql/src/test/results/clientpositive/spark/vector_decimal_mapjoin.q.out +++ ql/src/test/results/clientpositive/spark/vector_decimal_mapjoin.q.out @@ -1,34 +1,82 @@ -PREHOOK: query: -- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc -PREHOOK: type: CREATETABLE_AS_SELECT -PREHOOK: Input: default@alltypesorc +PREHOOK: query: CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE +PREHOOK: type: CREATETABLE PREHOOK: Output: database:default -PREHOOK: Output: default@decimal_mapjoin -POSTHOOK: query: -- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc -POSTHOOK: type: CREATETABLE_AS_SELECT -POSTHOOK: Input: default@alltypesorc +PREHOOK: Output: default@over1k +POSTHOOK: query: CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@over1k +PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@over1k +POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@over1k +PREHOOK: query: CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t1 +POSTHOOK: query: CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t1 +PREHOOK: query: INSERT INTO TABLE t1 select dec from over1k +PREHOOK: type: QUERY +PREHOOK: Input: default@over1k +PREHOOK: Output: default@t1 +POSTHOOK: query: INSERT INTO TABLE t1 select dec from over1k +POSTHOOK: type: QUERY +POSTHOOK: Input: default@over1k +POSTHOOK: Output: default@t1 +POSTHOOK: Lineage: t1.dec SIMPLE [(over1k)over1k.FieldSchema(name:dec, type:decimal(4,2), comment:null), ] +PREHOOK: query: CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t2 +POSTHOOK: query: CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC +POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default -POSTHOOK: Output: default@decimal_mapjoin -PREHOOK: query: EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: Output: default@t2 +PREHOOK: query: INSERT INTO TABLE t2 select dec from over1k +PREHOOK: type: QUERY +PREHOOK: Input: default@over1k +PREHOOK: Output: default@t2 +POSTHOOK: query: INSERT INTO TABLE t2 select dec from over1k +POSTHOOK: type: QUERY +POSTHOOK: Input: default@over1k +POSTHOOK: Output: default@t2 +POSTHOOK: Lineage: t2.dec EXPRESSION [(over1k)over1k.FieldSchema(name:dec, type:decimal(4,2), comment:null), ] +PREHOOK: query: explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) PREHOOK: type: QUERY -POSTHOOK: query: EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: query: explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) POSTHOOK: type: QUERY STAGE DEPENDENCIES: Stage-2 is a root stage @@ -43,15 +91,15 @@ STAGE PLANS: Map 2 Map Operator Tree: TableScan - alias: r - Statistics: Num rows: 12288 Data size: 2165060 Basic stats: COMPLETE Column stats: NONE + alias: t2 + Statistics: Num rows: 1049 Data size: 117488 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (cint = 6981) (type: boolean) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE + predicate: dec is not null (type: boolean) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE Spark HashTable Sink Operator keys: - 0 6981 (type: int) - 1 6981 (type: int) + 0 dec (type: decimal(4,2)) + 1 dec (type: decimal(4,0)) Local Work: Map Reduce Local Work @@ -62,28 +110,28 @@ STAGE PLANS: Map 1 Map Operator Tree: TableScan - alias: l - Statistics: Num rows: 12288 Data size: 2165060 Basic stats: COMPLETE Column stats: NONE + alias: t1 + Statistics: Num rows: 1049 Data size: 117488 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (cint = 6981) (type: boolean) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE + predicate: dec is not null (type: boolean) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE Map Join Operator condition map: Inner Join 0 to 1 keys: - 0 6981 (type: int) - 1 6981 (type: int) - outputColumnNames: _col1, _col9 + 0 dec (type: decimal(4,2)) + 1 dec (type: decimal(4,0)) + outputColumnNames: _col0, _col4 input vertices: 1 Map 2 - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE Select Operator - expressions: 6981 (type: int), 6981 (type: int), _col1 (type: decimal(20,10)), _col9 (type: decimal(23,14)) - outputColumnNames: _col0, _col1, _col2, _col3 - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + expressions: _col0 (type: decimal(4,2)), _col4 (type: decimal(4,0)) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat @@ -98,117 +146,123 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) PREHOOK: type: QUERY -PREHOOK: Input: default@decimal_mapjoin +PREHOOK: Input: default@t1 +PREHOOK: Input: default@t2 #### A masked pattern was here #### -POSTHOOK: query: SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) POSTHOOK: type: QUERY -POSTHOOK: Input: default@decimal_mapjoin +POSTHOOK: Input: default@t1 +POSTHOOK: Input: default@t2 #### A masked pattern was here #### -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 6984454.211097692 -6981 6981 -515.621072973 6984454.211097692 -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 5831542.269248378 -617.5607769230769 -6981 6981 5831542.269248378 -617.5607769230769 -6981 6981 5831542.269248378 6984454.211097692 -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +45 45 +45 45 +45 45 +45 45 +45 45 +6 6 +6 6 +6 6 +6 6 +6 6 +6 6 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +70 70 +70 70 +70 70 +70 70 +70 70 +70 70 +70 70 +79 79 +79 79 +79 79 +79 79 +79 79 +79 79 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 diff --git ql/src/test/results/clientpositive/tez/vector_aggregate_9.q.out ql/src/test/results/clientpositive/tez/vector_aggregate_9.q.out index 3f8a271..382380e 100644 --- ql/src/test/results/clientpositive/tez/vector_aggregate_9.q.out +++ ql/src/test/results/clientpositive/tez/vector_aggregate_9.q.out @@ -158,11 +158,15 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc +PREHOOK: query: -- SORT_QUERY_RESULTS + +select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc PREHOOK: type: QUERY PREHOOK: Input: default@vectortab2korc #### A masked pattern was here #### -POSTHOOK: query: select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc POSTHOOK: type: QUERY POSTHOOK: Input: default@vectortab2korc #### A masked pattern was here #### diff --git ql/src/test/results/clientpositive/tez/vector_char_mapjoin1.q.out ql/src/test/results/clientpositive/tez/vector_char_mapjoin1.q.out index b014699..f495f95 100644 --- ql/src/test/results/clientpositive/tez/vector_char_mapjoin1.q.out +++ ql/src/test/results/clientpositive/tez/vector_char_mapjoin1.q.out @@ -201,18 +201,22 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 PREHOOK: type: QUERY PREHOOK: Input: default@char_join1_vc1_orc #### A masked pattern was here #### -POSTHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 POSTHOOK: type: QUERY POSTHOOK: Input: default@char_join1_vc1_orc #### A masked pattern was here #### -1 abc 2 abc 1 abc 1 abc -2 abc 2 abc +1 abc 2 abc 2 abc 1 abc +2 abc 2 abc 3 abc 3 abc PREHOOK: query: -- Join char with different length char explain select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 @@ -297,20 +301,24 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 PREHOOK: type: QUERY PREHOOK: Input: default@char_join1_vc1_orc PREHOOK: Input: default@char_join1_vc2_orc #### A masked pattern was here #### -POSTHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 POSTHOOK: type: QUERY POSTHOOK: Input: default@char_join1_vc1_orc POSTHOOK: Input: default@char_join1_vc2_orc #### A masked pattern was here #### -1 abc 2 abc 1 abc 1 abc -2 abc 2 abc +1 abc 2 abc 2 abc 1 abc +2 abc 2 abc 3 abc 3 abc PREHOOK: query: -- Join char with string explain select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 @@ -394,12 +402,16 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 PREHOOK: type: QUERY PREHOOK: Input: default@char_join1_str_orc PREHOOK: Input: default@char_join1_vc1_orc #### A masked pattern was here #### -POSTHOOK: query: select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 POSTHOOK: type: QUERY POSTHOOK: Input: default@char_join1_str_orc POSTHOOK: Input: default@char_join1_vc1_orc diff --git ql/src/test/results/clientpositive/tez/vector_decimal_mapjoin.q.out ql/src/test/results/clientpositive/tez/vector_decimal_mapjoin.q.out index f418ae0..240b875 100644 --- ql/src/test/results/clientpositive/tez/vector_decimal_mapjoin.q.out +++ ql/src/test/results/clientpositive/tez/vector_decimal_mapjoin.q.out @@ -1,34 +1,82 @@ -PREHOOK: query: -- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc -PREHOOK: type: CREATETABLE_AS_SELECT -PREHOOK: Input: default@alltypesorc +PREHOOK: query: CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE +PREHOOK: type: CREATETABLE PREHOOK: Output: database:default -PREHOOK: Output: default@decimal_mapjoin -POSTHOOK: query: -- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc -POSTHOOK: type: CREATETABLE_AS_SELECT -POSTHOOK: Input: default@alltypesorc +PREHOOK: Output: default@over1k +POSTHOOK: query: CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@over1k +PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@over1k +POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@over1k +PREHOOK: query: CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t1 +POSTHOOK: query: CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t1 +PREHOOK: query: INSERT INTO TABLE t1 select dec from over1k +PREHOOK: type: QUERY +PREHOOK: Input: default@over1k +PREHOOK: Output: default@t1 +POSTHOOK: query: INSERT INTO TABLE t1 select dec from over1k +POSTHOOK: type: QUERY +POSTHOOK: Input: default@over1k +POSTHOOK: Output: default@t1 +POSTHOOK: Lineage: t1.dec SIMPLE [(over1k)over1k.FieldSchema(name:dec, type:decimal(4,2), comment:null), ] +PREHOOK: query: CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t2 +POSTHOOK: query: CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC +POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default -POSTHOOK: Output: default@decimal_mapjoin -PREHOOK: query: EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: Output: default@t2 +PREHOOK: query: INSERT INTO TABLE t2 select dec from over1k +PREHOOK: type: QUERY +PREHOOK: Input: default@over1k +PREHOOK: Output: default@t2 +POSTHOOK: query: INSERT INTO TABLE t2 select dec from over1k +POSTHOOK: type: QUERY +POSTHOOK: Input: default@over1k +POSTHOOK: Output: default@t2 +POSTHOOK: Lineage: t2.dec EXPRESSION [(over1k)over1k.FieldSchema(name:dec, type:decimal(4,2), comment:null), ] +PREHOOK: query: explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) PREHOOK: type: QUERY -POSTHOOK: query: EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: query: explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) POSTHOOK: type: QUERY STAGE DEPENDENCIES: Stage-1 is a root stage @@ -44,29 +92,29 @@ STAGE PLANS: Map 1 Map Operator Tree: TableScan - alias: l - Statistics: Num rows: 12288 Data size: 2165060 Basic stats: COMPLETE Column stats: NONE + alias: t1 + Statistics: Num rows: 1049 Data size: 117488 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (cint = 6981) (type: boolean) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE + predicate: dec is not null (type: boolean) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE Map Join Operator condition map: Inner Join 0 to 1 keys: - 0 6981 (type: int) - 1 6981 (type: int) - outputColumnNames: _col1, _col9 + 0 dec (type: decimal(6,2)) + 1 dec (type: decimal(6,2)) + outputColumnNames: _col0, _col4 input vertices: 1 Map 2 - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE HybridGraceHashJoin: true Select Operator - expressions: 6981 (type: int), 6981 (type: int), _col1 (type: decimal(20,10)), _col9 (type: decimal(23,14)) - outputColumnNames: _col0, _col1, _col2, _col3 - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + expressions: _col0 (type: decimal(4,2)), _col4 (type: decimal(4,0)) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat @@ -75,17 +123,17 @@ STAGE PLANS: Map 2 Map Operator Tree: TableScan - alias: r - Statistics: Num rows: 12288 Data size: 2165060 Basic stats: COMPLETE Column stats: NONE + alias: t2 + Statistics: Num rows: 1049 Data size: 117488 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (cint = 6981) (type: boolean) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE + predicate: dec is not null (type: boolean) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE Reduce Output Operator - key expressions: 6981 (type: int) + key expressions: dec (type: decimal(6,2)) sort order: + - Map-reduce partition columns: 6981 (type: int) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE - value expressions: cdecimal2 (type: decimal(23,14)) + Map-reduce partition columns: dec (type: decimal(6,2)) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE + value expressions: dec (type: decimal(4,0)) Execution mode: vectorized Stage: Stage-0 @@ -94,117 +142,123 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) PREHOOK: type: QUERY -PREHOOK: Input: default@decimal_mapjoin +PREHOOK: Input: default@t1 +PREHOOK: Input: default@t2 #### A masked pattern was here #### -POSTHOOK: query: SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) POSTHOOK: type: QUERY -POSTHOOK: Input: default@decimal_mapjoin +POSTHOOK: Input: default@t1 +POSTHOOK: Input: default@t2 #### A masked pattern was here #### -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 6984454.211097692 -6981 6981 -515.621072973 6984454.211097692 -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 5831542.269248378 -617.5607769230769 -6981 6981 5831542.269248378 -617.5607769230769 -6981 6981 5831542.269248378 6984454.211097692 -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +45 45 +45 45 +45 45 +45 45 +45 45 +6 6 +6 6 +6 6 +6 6 +6 6 +6 6 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +70 70 +70 70 +70 70 +70 70 +70 70 +70 70 +70 70 +79 79 +79 79 +79 79 +79 79 +79 79 +79 79 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 diff --git ql/src/test/results/clientpositive/tez/vector_inner_join.q.out ql/src/test/results/clientpositive/tez/vector_inner_join.q.out new file mode 100644 index 0000000..af80260 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_inner_join.q.out @@ -0,0 +1,806 @@ +PREHOOK: query: CREATE TABLE orc_table_1a(a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1a +POSTHOOK: query: CREATE TABLE orc_table_1a(a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1a +PREHOOK: query: CREATE TABLE orc_table_2a(c INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2a +POSTHOOK: query: CREATE TABLE orc_table_2a(c INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2a +PREHOOK: query: insert into table orc_table_1a values(1),(1), (2),(3) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@orc_table_1a +POSTHOOK: query: insert into table orc_table_1a values(1),(1), (2),(3) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@orc_table_1a +POSTHOOK: Lineage: orc_table_1a.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2a values(0),(2), (3),(null),(4) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__2 +PREHOOK: Output: default@orc_table_2a +POSTHOOK: query: insert into table orc_table_2a values(0),(2), (3),(null),(4) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__2 +POSTHOOK: Output: default@orc_table_2a +POSTHOOK: Lineage: orc_table_2a.c EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: explain +select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 2 <- Map 1 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: c (type: int) + sort order: + + Map-reduce partition columns: c (type: int) + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 4 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col4 + input vertices: + 0 Map 1 + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col4 (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1a +PREHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +POSTHOOK: query: select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1a +POSTHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +3 +PREHOOK: query: explain +select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: c (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Semi Join 0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + input vertices: + 1 Map 2 + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + File Output Operator + compressed: false + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: a is not null (type: boolean) + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: a (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Group By Operator + keys: _col0 (type: int) + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1a +PREHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +POSTHOOK: query: select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1a +POSTHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +3 +PREHOOK: query: CREATE TABLE orc_table_1b(v1 STRING, a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1b +POSTHOOK: query: CREATE TABLE orc_table_1b(v1 STRING, a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1b +PREHOOK: query: CREATE TABLE orc_table_2b(c INT, v2 STRING) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2b +POSTHOOK: query: CREATE TABLE orc_table_2b(c INT, v2 STRING) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2b +PREHOOK: query: insert into table orc_table_1b values("one", 1),("one", 1), ("two", 2),("three", 3) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__3 +PREHOOK: Output: default@orc_table_1b +POSTHOOK: query: insert into table orc_table_1b values("one", 1),("one", 1), ("two", 2),("three", 3) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__3 +POSTHOOK: Output: default@orc_table_1b +POSTHOOK: Lineage: orc_table_1b.a EXPRESSION [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_1b.v1 SIMPLE [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2b values(0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR") +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__4 +PREHOOK: Output: default@orc_table_2b +POSTHOOK: query: insert into table orc_table_2b values(0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR") +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__4 +POSTHOOK: Output: default@orc_table_2b +POSTHOOK: Lineage: orc_table_2b.c EXPRESSION [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_2b.v2 SIMPLE [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: explain +select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col5 (type: string), _col6 (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three 3 +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col5 (type: string), _col6 (type: int), _col0 (type: int), _col1 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three 3 3 THREE +PREHOOK: query: explain +select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col5 (type: string), (_col6 * 2) (type: int), (_col0 * 5) (type: int), _col1 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three 6 15 THREE +PREHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col0, _col1, _col5 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col5 (type: string), _col1 (type: string), _col0 (type: int) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three THREE 3 +PREHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col1, _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col6 (type: int), _col5 (type: string), _col1 (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +3 three THREE +PREHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col0 (type: string), _col6 (type: string), _col5 (type: int) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: c (type: int) + sort order: + + Map-reduce partition columns: c (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v2 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three THREE 3 +PREHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col1 (type: int), _col0 (type: string), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: c (type: int) + sort order: + + Map-reduce partition columns: c (type: int) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + value expressions: v2 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +3 three THREE diff --git ql/src/test/results/clientpositive/tez/vector_left_outer_join.q.out ql/src/test/results/clientpositive/tez/vector_left_outer_join.q.out index 5fc05ea..ce722e8 100644 --- ql/src/test/results/clientpositive/tez/vector_left_outer_join.q.out +++ ql/src/test/results/clientpositive/tez/vector_left_outer_join.q.out @@ -47,7 +47,6 @@ STAGE PLANS: input vertices: 1 Map 3 Statistics: Num rows: 13516 Data size: 2906160 Basic stats: COMPLETE Column stats: NONE - HybridGraceHashJoin: true Map Join Operator condition map: Left Outer Join0 to 1 @@ -57,7 +56,6 @@ STAGE PLANS: input vertices: 1 Map 4 Statistics: Num rows: 14867 Data size: 3196776 Basic stats: COMPLETE Column stats: NONE - HybridGraceHashJoin: true Group By Operator aggregations: count() mode: hash diff --git ql/src/test/results/clientpositive/tez/vector_mapjoin_reduce.q.out ql/src/test/results/clientpositive/tez/vector_mapjoin_reduce.q.out index 29b86bd..053cda4 100644 --- ql/src/test/results/clientpositive/tez/vector_mapjoin_reduce.q.out +++ ql/src/test/results/clientpositive/tez/vector_mapjoin_reduce.q.out @@ -56,7 +56,6 @@ STAGE PLANS: input vertices: 1 Map 2 Statistics: Num rows: 27 Data size: 3298 Basic stats: COMPLETE Column stats: NONE - HybridGraceHashJoin: true Map Join Operator condition map: Inner Join 0 to 1 @@ -67,7 +66,6 @@ STAGE PLANS: input vertices: 1 Reducer 4 Statistics: Num rows: 29 Data size: 3627 Basic stats: COMPLETE Column stats: NONE - HybridGraceHashJoin: true Select Operator expressions: _col1 (type: int), _col2 (type: int) outputColumnNames: _col0, _col1 @@ -215,7 +213,6 @@ STAGE PLANS: input vertices: 1 Map 2 Statistics: Num rows: 14 Data size: 1714 Basic stats: COMPLETE Column stats: NONE - HybridGraceHashJoin: true Reduce Output Operator key expressions: _col1 (type: int) sort order: + @@ -283,7 +280,6 @@ STAGE PLANS: input vertices: 0 Map 1 Statistics: Num rows: 27 Data size: 3298 Basic stats: COMPLETE Column stats: NONE - HybridGraceHashJoin: true Select Operator expressions: _col1 (type: int), _col2 (type: int) outputColumnNames: _col0, _col1 diff --git ql/src/test/results/clientpositive/tez/vector_outer_join.q.out ql/src/test/results/clientpositive/tez/vector_outer_join.q.out new file mode 100644 index 0000000..9691c48 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_outer_join.q.out @@ -0,0 +1,2204 @@ +PREHOOK: query: CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1 +POSTHOOK: query: CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1 +PREHOOK: query: CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2 +POSTHOOK: query: CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2 +PREHOOK: query: insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@orc_table_1 +POSTHOOK: query: insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@orc_table_1 +POSTHOOK: Lineage: orc_table_1.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_1.v1 SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, "") +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__2 +PREHOOK: Output: default@orc_table_2 +POSTHOOK: query: insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, "") +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__2 +POSTHOOK: Output: default@orc_table_2 +POSTHOOK: Lineage: orc_table_2.c EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_2.v2 SIMPLE [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: select * from orc_table_1 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +#### A masked pattern was here #### +POSTHOOK: query: select * from orc_table_1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +#### A masked pattern was here #### + NULL + NULL +one 1 +one 1 +three 3 +two 2 +PREHOOK: query: select * from orc_table_2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: select * from orc_table_2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +0 ZERO +2 TWO +3 THREE +4 FOUR +NULL +NULL +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col0 (type: string), _col1 (type: int), _col5 (type: int), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: c (type: int) + sort order: + + Map-reduce partition columns: c (type: int) + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + value expressions: v2 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### + NULL NULL NULL + NULL NULL NULL +one 1 NULL NULL +one 1 NULL NULL +three 3 3 THREE +two 2 2 TWO +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 2 <- Map 1 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Right Outer Join0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + input vertices: + 0 Map 1 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col0 (type: string), _col1 (type: int), _col5 (type: int), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +NULL NULL 0 ZERO +NULL NULL 4 FOUR +NULL NULL NULL +NULL NULL NULL +three 3 3 THREE +two 2 2 TWO +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23 + input vertices: + 1 Map 2 + Statistics: Num rows: 12 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 12 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col2 (type: int) + sort order: + + Map-reduce partition columns: _col2 (type: int) + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: tinyint), _col1 (type: smallint), _col3 (type: bigint), _col4 (type: float), _col5 (type: double), _col6 (type: string), _col7 (type: string), _col8 (type: timestamp), _col9 (type: timestamp), _col10 (type: boolean), _col11 (type: boolean) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +-21 -200 NULL NULL -21.0 -200.0 NULL NULL 1969-12-31 16:00:09.052 1969-12-31 15:59:55.451 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +3 -200 NULL -1438142492 3.0 -200.0 NULL T8Uakh8tudd1XRG5yKW8Y42H 1969-12-31 16:00:07.648 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -200 NULL -245476731 31.0 -200.0 NULL 3E3BxP 1969-12-31 15:59:54.739 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL -1090414113 38.0 -200.0 NULL 5oQ43l 1969-12-31 16:00:05.478 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL 1576772382 38.0 -200.0 NULL X3Ufbt46AUIfHe 1969-12-31 15:59:49.567 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +PREHOOK: query: explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + input vertices: + 1 Map 2 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +-21 +-28 +-34 +-50 +29 +3 +31 +31 +31 +31 +38 +38 +38 +38 +NULL +NULL +NULL +NULL +NULL +PREHOOK: query: explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + input vertices: + 1 Map 3 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + input vertices: + 1 Map 4 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count(), sum(_col0) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint), _col1 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0), sum(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +108 1646 +PREHOOK: query: explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 304 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cbigint (type: bigint) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 304 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col1 + input vertices: + 1 Map 3 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: bigint) + 1 _col0 (type: bigint) + outputColumnNames: _col1 + input vertices: + 1 Map 4 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col1 (type: bigint) + outputColumnNames: _col0 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count(), sum(_col0) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint), _col1 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cbigint (type: bigint) + outputColumnNames: _col0 + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: bigint) + sort order: + + Map-reduce partition columns: _col0 (type: bigint) + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0), sum(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 -1197260954 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cstring1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col1 + input vertices: + 1 Map 3 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + input vertices: + 1 Map 4 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string) + sort order: + + Map-reduce partition columns: _col0 (type: string) + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +1005 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 18 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string), cstring2 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 18 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + outputColumnNames: _col0 + input vertices: + 1 Map 3 + Statistics: Num rows: 39 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: string) + 1 _col0 (type: string) + input vertices: + 1 Map 4 + Statistics: Num rows: 42 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring2 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string) + sort order: + + Map-reduce partition columns: _col0 (type: string) + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string) + sort order: + + Map-reduce partition columns: _col0 (type: string) + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 17 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cbigint (type: bigint), cstring1 (type: string), cstring2 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 17 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col3 (type: string), _col1 (type: bigint) + 1 _col1 (type: string), _col0 (type: bigint) + outputColumnNames: _col0, _col2 + input vertices: + 1 Map 3 + Statistics: Num rows: 36 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: string), _col0 (type: int) + 1 _col1 (type: string), _col0 (type: int) + input vertices: + 1 Map 4 + Statistics: Num rows: 39 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 33 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cbigint (type: bigint), cstring2 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 33 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col1 (type: string), _col0 (type: bigint) + sort order: ++ + Map-reduce partition columns: _col1 (type: string), _col0 (type: bigint) + Statistics: Num rows: 33 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cstring1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col1 (type: string), _col0 (type: int) + sort order: ++ + Map-reduce partition columns: _col1 (type: string), _col0 (type: int) + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 +PREHOOK: query: create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1b +POSTHOOK: query: create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1b +PREHOOK: query: create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2b +POSTHOOK: query: create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2b +PREHOOK: query: create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3b +POSTHOOK: query: create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3b +PREHOOK: query: create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4b +POSTHOOK: query: create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4b +PREHOOK: query: create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1b +PREHOOK: Input: default@small_alltypesorc2b +PREHOOK: Input: default@small_alltypesorc3b +PREHOOK: Input: default@small_alltypesorc4b +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_b +POSTHOOK: query: create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1b +POSTHOOK: Input: default@small_alltypesorc2b +POSTHOOK: Input: default@small_alltypesorc3b +POSTHOOK: Input: default@small_alltypesorc4b +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_b +PREHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +PREHOOK: Output: default@small_alltypesorc_b +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +POSTHOOK: Output: default@small_alltypesorc_b +PREHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +PREHOOK: query: explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23 + input vertices: + 1 Map 2 + Statistics: Num rows: 13 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 13 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col2 (type: int) + sort order: + + Map-reduce partition columns: _col2 (type: int) + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: tinyint), _col1 (type: smallint), _col3 (type: bigint), _col4 (type: float), _col5 (type: double), _col6 (type: string), _col7 (type: string), _col8 (type: timestamp), _col9 (type: timestamp), _col10 (type: boolean), _col11 (type: boolean) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +-10 -200 NULL -1818374653 -10.0 -200.0 NULL uFavNs7g58qrfyCH681d 1969-12-31 16:00:03.248 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-21 -200 NULL NULL -21.0 -200.0 NULL NULL 1969-12-31 16:00:09.052 1969-12-31 15:59:55.451 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-30 -200 NULL -815881183 -30.0 -200.0 NULL B0B5kG3OIl6C 1969-12-31 15:59:44.842 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-39 -200 NULL 944477914 -39.0 -200.0 NULL T8brJ213nd7rhW8XdnB1 1969-12-31 16:00:00.958 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-63 -200 NULL 1927856372 -63.0 -200.0 NULL v6mk2b7oX 1969-12-31 16:00:06.852 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +3 -200 NULL -1438142492 3.0 -200.0 NULL T8Uakh8tudd1XRG5yKW8Y42H 1969-12-31 16:00:07.648 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -200 NULL -245476731 31.0 -200.0 NULL 3E3BxP 1969-12-31 15:59:54.739 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL -1090414113 38.0 -200.0 NULL 5oQ43l 1969-12-31 16:00:05.478 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL 1576772382 38.0 -200.0 NULL X3Ufbt46AUIfHe 1969-12-31 15:59:49.567 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +8 -200 NULL -1236645308 8.0 -200.0 NULL M28wJxOvunO3EImapE7OApQ 1969-12-31 15:59:46.007 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +PREHOOK: query: explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + input vertices: + 1 Map 2 + Statistics: Num rows: 1093 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1093 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +-10 +-11 +-21 +-28 +-30 +-34 +-39 +-50 +-63 +16 +27 +29 +3 +31 +31 +31 +31 +31 +31 +31 +31 +31 +38 +38 +38 +38 +61 +8 +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +PREHOOK: query: explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 497 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 497 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + input vertices: + 1 Map 3 + Statistics: Num rows: 1093 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + input vertices: + 1 Map 4 + Statistics: Num rows: 1202 Data size: 4811 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +414 diff --git ql/src/test/results/clientpositive/tez/vector_outer_join0.q.out ql/src/test/results/clientpositive/tez/vector_outer_join0.q.out new file mode 100644 index 0000000..d1ee177 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_outer_join0.q.out @@ -0,0 +1,232 @@ +PREHOOK: query: CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1 +POSTHOOK: query: CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1 +PREHOOK: query: CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2 +POSTHOOK: query: CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2 +PREHOOK: query: insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@orc_table_1 +POSTHOOK: query: insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@orc_table_1 +POSTHOOK: Lineage: orc_table_1.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_1.v1 SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, "") +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__2 +PREHOOK: Output: default@orc_table_2 +POSTHOOK: query: insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, "") +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__2 +POSTHOOK: Output: default@orc_table_2 +POSTHOOK: Lineage: orc_table_2.c EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_2.v2 SIMPLE [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: select * from orc_table_1 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +#### A masked pattern was here #### +POSTHOOK: query: select * from orc_table_1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +#### A masked pattern was here #### + NULL + NULL +one 1 +one 1 +three 3 +two 2 +PREHOOK: query: select * from orc_table_2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: select * from orc_table_2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +0 ZERO +2 TWO +3 THREE +4 FOUR +NULL +NULL +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + input vertices: + 1 Map 2 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col0 (type: string), _col1 (type: int), _col5 (type: int), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: c (type: int) + sort order: + + Map-reduce partition columns: c (type: int) + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + value expressions: v2 (type: string) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### + NULL NULL NULL + NULL NULL NULL +one 1 NULL NULL +one 1 NULL NULL +three 3 3 THREE +two 2 2 TWO +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 2 <- Map 1 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: a (type: int) + sort order: + + Map-reduce partition columns: a (type: int) + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + value expressions: v1 (type: string) + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Right Outer Join0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + input vertices: + 0 Map 1 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col0 (type: string), _col1 (type: int), _col5 (type: int), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +NULL NULL 0 ZERO +NULL NULL 4 FOUR +NULL NULL NULL +NULL NULL NULL +three 3 3 THREE +two 2 2 TWO diff --git ql/src/test/results/clientpositive/tez/vector_outer_join1.q.out ql/src/test/results/clientpositive/tez/vector_outer_join1.q.out new file mode 100644 index 0000000..8368a77 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_outer_join1.q.out @@ -0,0 +1,541 @@ +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23 + input vertices: + 1 Map 2 + Statistics: Num rows: 12 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + File Output Operator + compressed: false + Statistics: Num rows: 12 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col2 (type: int) + sort order: + + Map-reduce partition columns: _col2 (type: int) + Statistics: Num rows: 11 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: tinyint), _col1 (type: smallint), _col3 (type: bigint), _col4 (type: float), _col5 (type: double), _col6 (type: string), _col7 (type: string), _col8 (type: timestamp), _col9 (type: timestamp), _col10 (type: boolean), _col11 (type: boolean) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +-21 -200 NULL NULL -21.0 -200.0 NULL NULL 1969-12-31 16:00:09.052 1969-12-31 15:59:55.451 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +3 -200 NULL -1438142492 3.0 -200.0 NULL T8Uakh8tudd1XRG5yKW8Y42H 1969-12-31 16:00:07.648 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -200 NULL -245476731 31.0 -200.0 NULL 3E3BxP 1969-12-31 15:59:54.739 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +38 -200 NULL -1090414113 38.0 -200.0 NULL 5oQ43l 1969-12-31 16:00:05.478 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL 1576772382 38.0 -200.0 NULL X3Ufbt46AUIfHe 1969-12-31 15:59:49.567 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +PREHOOK: query: explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + input vertices: + 1 Map 2 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + File Output Operator + compressed: false + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +-21 +-28 +-34 +-50 +29 +3 +31 +31 +31 +31 +38 +38 +38 +38 +NULL +NULL +NULL +NULL +NULL +PREHOOK: query: explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + input vertices: + 1 Map 3 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + input vertices: + 1 Map 4 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Group By Operator + aggregations: count(), sum(_col0) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint), _col1 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0), sum(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +118 -14 diff --git ql/src/test/results/clientpositive/tez/vector_outer_join2.q.out ql/src/test/results/clientpositive/tez/vector_outer_join2.q.out new file mode 100644 index 0000000..8d38477 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_outer_join2.q.out @@ -0,0 +1,238 @@ +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 304 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cbigint (type: bigint) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 304 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col1 + input vertices: + 1 Map 3 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: bigint) + 1 _col0 (type: bigint) + outputColumnNames: _col1 + input vertices: + 1 Map 4 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Select Operator + expressions: _col1 (type: bigint) + outputColumnNames: _col0 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count(), sum(_col0) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint), _col1 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cbigint (type: bigint) + outputColumnNames: _col0 + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: bigint) + sort order: + + Map-reduce partition columns: _col0 (type: bigint) + Statistics: Num rows: 457 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0), sum(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 -1197260954 diff --git ql/src/test/results/clientpositive/tez/vector_outer_join3.q.out ql/src/test/results/clientpositive/tez/vector_outer_join3.q.out new file mode 100644 index 0000000..b45192c --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_outer_join3.q.out @@ -0,0 +1,527 @@ +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cstring1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col1 + input vertices: + 1 Map 3 + Statistics: Num rows: 1005 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + input vertices: + 1 Map 4 + Statistics: Num rows: 1105 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 914 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string) + sort order: + + Map-reduce partition columns: _col0 (type: string) + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +1005 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 18 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string), cstring2 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 18 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + outputColumnNames: _col0 + input vertices: + 1 Map 3 + Statistics: Num rows: 39 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: string) + 1 _col0 (type: string) + input vertices: + 1 Map 4 + Statistics: Num rows: 42 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring2 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string) + sort order: + + Map-reduce partition columns: _col0 (type: string) + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string) + sort order: + + Map-reduce partition columns: _col0 (type: string) + Statistics: Num rows: 36 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 17 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cbigint (type: bigint), cstring1 (type: string), cstring2 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 17 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col3 (type: string), _col1 (type: bigint) + 1 _col1 (type: string), _col0 (type: bigint) + outputColumnNames: _col0, _col2 + input vertices: + 1 Map 3 + Statistics: Num rows: 36 Data size: 4021 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: string), _col0 (type: int) + 1 _col1 (type: string), _col0 (type: int) + input vertices: + 1 Map 4 + Statistics: Num rows: 39 Data size: 4423 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 33 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cbigint (type: bigint), cstring2 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 33 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col1 (type: string), _col0 (type: bigint) + sort order: ++ + Map-reduce partition columns: _col1 (type: string), _col0 (type: bigint) + Statistics: Num rows: 33 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cstring1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col1 (type: string), _col0 (type: int) + sort order: ++ + Map-reduce partition columns: _col1 (type: string), _col0 (type: int) + Statistics: Num rows: 35 Data size: 3656 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 diff --git ql/src/test/results/clientpositive/tez/vector_outer_join4.q.out ql/src/test/results/clientpositive/tez/vector_outer_join4.q.out new file mode 100644 index 0000000..6dce642 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_outer_join4.q.out @@ -0,0 +1,864 @@ +PREHOOK: query: create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1b +POSTHOOK: query: create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1b +PREHOOK: query: create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2b +POSTHOOK: query: create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2b +PREHOOK: query: create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3b +POSTHOOK: query: create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3b +PREHOOK: query: create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4b +POSTHOOK: query: create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4b +PREHOOK: query: create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1b +PREHOOK: Input: default@small_alltypesorc2b +PREHOOK: Input: default@small_alltypesorc3b +PREHOOK: Input: default@small_alltypesorc4b +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_b +POSTHOOK: query: create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1b +POSTHOOK: Input: default@small_alltypesorc2b +POSTHOOK: Input: default@small_alltypesorc3b +POSTHOOK: Input: default@small_alltypesorc4b +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_b +PREHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +PREHOOK: Output: default@small_alltypesorc_b +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +POSTHOOK: Output: default@small_alltypesorc_b +PREHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +PREHOOK: query: explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23 + input vertices: + 1 Map 2 + Statistics: Num rows: 13 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + File Output Operator + compressed: false + Statistics: Num rows: 13 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col2 (type: int) + sort order: + + Map-reduce partition columns: _col2 (type: int) + Statistics: Num rows: 12 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: tinyint), _col1 (type: smallint), _col3 (type: bigint), _col4 (type: float), _col5 (type: double), _col6 (type: string), _col7 (type: string), _col8 (type: timestamp), _col9 (type: timestamp), _col10 (type: boolean), _col11 (type: boolean) + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +-10 -200 NULL -1818374653 -10.0 -200.0 NULL uFavNs7g58qrfyCH681d 1969-12-31 16:00:03.248 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-21 -200 NULL NULL -21.0 -200.0 NULL NULL 1969-12-31 16:00:09.052 1969-12-31 15:59:55.451 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-30 -200 NULL -815881183 -30.0 -200.0 NULL B0B5kG3OIl6C 1969-12-31 15:59:44.842 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-39 -200 NULL 944477914 -39.0 -200.0 NULL T8brJ213nd7rhW8XdnB1 1969-12-31 16:00:00.958 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-63 -200 NULL 1927856372 -63.0 -200.0 NULL v6mk2b7oX 1969-12-31 16:00:06.852 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +3 -200 NULL -1438142492 3.0 -200.0 NULL T8Uakh8tudd1XRG5yKW8Y42H 1969-12-31 16:00:07.648 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -200 NULL -245476731 31.0 -200.0 NULL 3E3BxP 1969-12-31 15:59:54.739 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +38 -200 NULL -1090414113 38.0 -200.0 NULL 5oQ43l 1969-12-31 16:00:05.478 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL 1576772382 38.0 -200.0 NULL X3Ufbt46AUIfHe 1969-12-31 15:59:49.567 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +8 -200 NULL -1236645308 8.0 -200.0 NULL M28wJxOvunO3EImapE7OApQ 1969-12-31 15:59:46.007 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +PREHOOK: query: explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 2 (BROADCAST_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + input vertices: + 1 Map 2 + Statistics: Num rows: 1093 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + File Output Operator + compressed: false + Statistics: Num rows: 1093 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + Map 2 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +-10 +-11 +-21 +-28 +-30 +-34 +-39 +-50 +-63 +16 +27 +29 +3 +31 +31 +31 +31 +31 +31 +31 +31 +31 +38 +38 +38 +38 +61 +8 +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +PREHOOK: query: explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Map 1 <- Map 3 (BROADCAST_EDGE), Map 4 (BROADCAST_EDGE) + Reducer 2 <- Map 1 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 497 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 497 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + input vertices: + 1 Map 3 + Statistics: Num rows: 1093 Data size: 4374 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + input vertices: + 1 Map 4 + Statistics: Num rows: 1202 Data size: 4811 Basic stats: COMPLETE Column stats: NONE + HybridGraceHashJoin: true + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Execution mode: vectorized + Map 3 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Map 4 + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 994 Data size: 3977 Basic stats: COMPLETE Column stats: NONE + Execution mode: vectorized + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +494 diff --git ql/src/test/results/clientpositive/tez/vectorized_parquet_types.q.out ql/src/test/results/clientpositive/tez/vectorized_parquet_types.q.out new file mode 100644 index 0000000..63e1e11 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vectorized_parquet_types.q.out @@ -0,0 +1,347 @@ +PREHOOK: query: DROP TABLE parquet_types_staging +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE parquet_types_staging +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP TABLE parquet_types +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE parquet_types +POSTHOOK: type: DROPTABLE +PREHOOK: query: -- init +CREATE TABLE parquet_types_staging ( + cint int, + ctinyint tinyint, + csmallint smallint, + cfloat float, + cdouble double, + cstring1 string, + t timestamp, + cchar char(5), + cvarchar varchar(10), + cbinary string, + m1 map, + l1 array, + st1 struct, + d date, + cdecimal decimal(4,2) +) ROW FORMAT DELIMITED +FIELDS TERMINATED BY '|' +COLLECTION ITEMS TERMINATED BY ',' +MAP KEYS TERMINATED BY ':' +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@parquet_types_staging +POSTHOOK: query: -- init +CREATE TABLE parquet_types_staging ( + cint int, + ctinyint tinyint, + csmallint smallint, + cfloat float, + cdouble double, + cstring1 string, + t timestamp, + cchar char(5), + cvarchar varchar(10), + cbinary string, + m1 map, + l1 array, + st1 struct, + d date, + cdecimal decimal(4,2) +) ROW FORMAT DELIMITED +FIELDS TERMINATED BY '|' +COLLECTION ITEMS TERMINATED BY ',' +MAP KEYS TERMINATED BY ':' +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@parquet_types_staging +PREHOOK: query: CREATE TABLE parquet_types ( + cint int, + ctinyint tinyint, + csmallint smallint, + cfloat float, + cdouble double, + cstring1 string, + t timestamp, + cchar char(5), + cvarchar varchar(10), + cbinary binary, + cdecimal decimal(4,2) +) STORED AS PARQUET +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@parquet_types +POSTHOOK: query: CREATE TABLE parquet_types ( + cint int, + ctinyint tinyint, + csmallint smallint, + cfloat float, + cdouble double, + cstring1 string, + t timestamp, + cchar char(5), + cvarchar varchar(10), + cbinary binary, + cdecimal decimal(4,2) +) STORED AS PARQUET +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@parquet_types +PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_types.txt' OVERWRITE INTO TABLE parquet_types_staging +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@parquet_types_staging +POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_types.txt' OVERWRITE INTO TABLE parquet_types_staging +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@parquet_types_staging +PREHOOK: query: INSERT OVERWRITE TABLE parquet_types +SELECT cint, ctinyint, csmallint, cfloat, cdouble, cstring1, t, cchar, cvarchar, +unhex(cbinary), cdecimal FROM parquet_types_staging +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_types_staging +PREHOOK: Output: default@parquet_types +POSTHOOK: query: INSERT OVERWRITE TABLE parquet_types +SELECT cint, ctinyint, csmallint, cfloat, cdouble, cstring1, t, cchar, cvarchar, +unhex(cbinary), cdecimal FROM parquet_types_staging +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_types_staging +POSTHOOK: Output: default@parquet_types +POSTHOOK: Lineage: parquet_types.cbinary EXPRESSION [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cbinary, type:string, comment:null), ] +POSTHOOK: Lineage: parquet_types.cchar SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cchar, type:char(5), comment:null), ] +POSTHOOK: Lineage: parquet_types.cdecimal SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cdecimal, type:decimal(4,2), comment:null), ] +POSTHOOK: Lineage: parquet_types.cdouble SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cdouble, type:double, comment:null), ] +POSTHOOK: Lineage: parquet_types.cfloat SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cfloat, type:float, comment:null), ] +POSTHOOK: Lineage: parquet_types.cint SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cint, type:int, comment:null), ] +POSTHOOK: Lineage: parquet_types.csmallint SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:csmallint, type:smallint, comment:null), ] +POSTHOOK: Lineage: parquet_types.cstring1 SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cstring1, type:string, comment:null), ] +POSTHOOK: Lineage: parquet_types.ctinyint SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:ctinyint, type:tinyint, comment:null), ] +POSTHOOK: Lineage: parquet_types.cvarchar SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:cvarchar, type:varchar(10), comment:null), ] +POSTHOOK: Lineage: parquet_types.t SIMPLE [(parquet_types_staging)parquet_types_staging.FieldSchema(name:t, type:timestamp, comment:null), ] +PREHOOK: query: -- select +explain +SELECT cint, ctinyint, csmallint, cfloat, cdouble, cstring1, t, cchar, cvarchar, +hex(cbinary), cdecimal FROM parquet_types +PREHOOK: type: QUERY +POSTHOOK: query: -- select +explain +SELECT cint, ctinyint, csmallint, cfloat, cdouble, cstring1, t, cchar, cvarchar, +hex(cbinary), cdecimal FROM parquet_types +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: parquet_types + Select Operator + expressions: cint (type: int), ctinyint (type: tinyint), csmallint (type: smallint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), t (type: timestamp), cchar (type: char(5)), cvarchar (type: varchar(10)), hex(cbinary) (type: string), cdecimal (type: decimal(4,2)) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10 + ListSink + +PREHOOK: query: SELECT cint, ctinyint, csmallint, cfloat, cdouble, cstring1, t, cchar, cvarchar, +hex(cbinary), cdecimal FROM parquet_types +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_types +#### A masked pattern was here #### +POSTHOOK: query: SELECT cint, ctinyint, csmallint, cfloat, cdouble, cstring1, t, cchar, cvarchar, +hex(cbinary), cdecimal FROM parquet_types +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_types +#### A masked pattern was here #### +100 1 1 1.0 0.0 abc 2011-01-01 01:01:01.111111111 a a B4F3CAFDBEDD 48.88 +101 2 2 1.1 0.3 def 2012-02-02 02:02:02.222222222 ab ab 68692CCAC0BDE7 8.72 +102 3 3 1.2 0.6 ghi 2013-03-03 03:03:03.333333333 abc abc B4F3CAFDBEDD 90.21 +103 1 4 1.3 0.9 jkl 2014-04-04 04:04:04.444444444 abcd abcd 68692CCAC0BDE7 3.89 +104 2 5 1.4 1.2 mno 2015-05-05 05:05:05.555555555 abcde abcde B4F3CAFDBEDD 56.23 +105 3 1 1.0 1.5 pqr 2016-06-06 06:06:06.666666666 abcde abcdef 68692CCAC0BDE7 90.21 +106 1 2 1.1 1.8 stu 2017-07-07 07:07:07.777777777 abcde abcdefg B4F3CAFDBEDD 6.09 +107 2 3 1.2 2.1 vwx 2018-08-08 08:08:08.888888888 bcdef abcdefgh 68692CCAC0BDE7 9.44 +108 3 4 1.3 2.4 yza 2019-09-09 09:09:09.999999999 cdefg B4F3CAFDBE 68656C6C6F 77.54 +109 1 5 1.4 2.7 bcd 2020-10-10 10:10:10.101010101 klmno abcdedef 68692CCAC0BDE7 25.42 +110 2 1 1.0 3.0 efg 2021-11-11 11:11:11.111111111 pqrst abcdede B4F3CAFDBEDD 60.12 +111 3 2 1.1 3.3 hij 2022-12-12 12:12:12.121212121 nopqr abcded 68692CCAC0BDE7 49.56 +112 1 3 1.2 3.6 klm 2023-01-02 13:13:13.131313131 opqrs abcdd B4F3CAFDBEDD 80.76 +113 2 4 1.3 3.9 nop 2024-02-02 14:14:14.141414141 pqrst abc 68692CCAC0BDE7 23.23 +114 3 5 1.4 4.2 qrs 2025-03-03 15:15:15.151515151 qrstu b B4F3CAFDBEDD 1.01 +115 1 1 1.0 4.5 qrs 2026-04-04 16:16:16.161616161 rstuv abcded 68692CCAC0BDE7 5.98 +116 2 2 1.1 4.8 wxy 2027-05-05 17:17:17.171717171 stuvw abcded B4F3CAFDBEDD 11.22 +117 3 3 1.2 5.1 zab 2028-06-06 18:18:18.181818181 tuvwx abcded 68692CCAC0BDE7 9.88 +118 1 4 1.3 5.4 cde 2029-07-07 19:19:19.191919191 uvwzy abcdede B4F3CAFDBEDD 4.76 +119 2 5 1.4 5.7 fgh 2030-08-08 20:20:20.202020202 vwxyz abcdede 68692CCAC0BDE7 12.83 +120 3 1 1.0 6.0 ijk 2031-09-09 21:21:21.212121212 wxyza abcde B4F3CAFDBEDD 73.04 +121 1 2 1.1 6.3 lmn 2032-10-10 22:22:22.222222222 bcdef abcde 90.33 +PREHOOK: query: explain +SELECT cchar, LENGTH(cchar), cvarchar, LENGTH(cvarchar), cdecimal, SIGN(cdecimal) FROM parquet_types +PREHOOK: type: QUERY +POSTHOOK: query: explain +SELECT cchar, LENGTH(cchar), cvarchar, LENGTH(cvarchar), cdecimal, SIGN(cdecimal) FROM parquet_types +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: parquet_types + Select Operator + expressions: cchar (type: char(5)), length(cchar) (type: int), cvarchar (type: varchar(10)), length(cvarchar) (type: int), cdecimal (type: decimal(4,2)), sign(cdecimal) (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5 + ListSink + +PREHOOK: query: SELECT cchar, LENGTH(cchar), cvarchar, LENGTH(cvarchar), cdecimal, SIGN(cdecimal) FROM parquet_types +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_types +#### A masked pattern was here #### +POSTHOOK: query: SELECT cchar, LENGTH(cchar), cvarchar, LENGTH(cvarchar), cdecimal, SIGN(cdecimal) FROM parquet_types +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_types +#### A masked pattern was here #### +a 1 a 3 48.88 1 +ab 2 ab 3 8.72 1 +abc 3 abc 3 90.21 1 +abcd 4 abcd 4 3.89 1 +abcde 5 abcde 5 56.23 1 +abcde 5 abcdef 6 90.21 1 +abcde 5 abcdefg 7 6.09 1 +bcdef 5 abcdefgh 8 9.44 1 +cdefg 5 B4F3CAFDBE 10 77.54 1 +klmno 5 abcdedef 8 25.42 1 +pqrst 5 abcdede 7 60.12 1 +nopqr 5 abcded 6 49.56 1 +opqrs 5 abcdd 5 80.76 1 +pqrst 5 abc 3 23.23 1 +qrstu 5 b 1 1.01 1 +rstuv 5 abcded 6 5.98 1 +stuvw 5 abcded 6 11.22 1 +tuvwx 5 abcded 6 9.88 1 +uvwzy 5 abcdede 7 4.76 1 +vwxyz 5 abcdede 7 12.83 1 +wxyza 5 abcde 5 73.04 1 +bcdef 5 abcde 5 90.33 1 +PREHOOK: query: explain +SELECT ctinyint, + MAX(cint), + MIN(csmallint), + COUNT(cstring1), + AVG(cfloat), + STDDEV_POP(cdouble), + MAX(cdecimal) +FROM parquet_types +GROUP BY ctinyint +ORDER BY ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +SELECT ctinyint, + MAX(cint), + MIN(csmallint), + COUNT(cstring1), + AVG(cfloat), + STDDEV_POP(cdouble), + MAX(cdecimal) +FROM parquet_types +GROUP BY ctinyint +ORDER BY ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Tez + Edges: + Reducer 2 <- Map 1 (SIMPLE_EDGE) + Reducer 3 <- Reducer 2 (SIMPLE_EDGE) +#### A masked pattern was here #### + Vertices: + Map 1 + Map Operator Tree: + TableScan + alias: parquet_types + Statistics: Num rows: 22 Data size: 242 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int), csmallint (type: smallint), cstring1 (type: string), cfloat (type: float), cdouble (type: double), cdecimal (type: decimal(4,2)) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6 + Statistics: Num rows: 22 Data size: 242 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: max(_col1), min(_col2), count(_col3), avg(_col4), stddev_pop(_col5), max(_col6) + keys: _col0 (type: tinyint) + mode: hash + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6 + Statistics: Num rows: 22 Data size: 242 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Map-reduce partition columns: _col0 (type: tinyint) + Statistics: Num rows: 22 Data size: 242 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: smallint), _col3 (type: bigint), _col4 (type: struct), _col5 (type: struct), _col6 (type: decimal(4,2)) + Reducer 2 + Reduce Operator Tree: + Group By Operator + aggregations: max(VALUE._col0), min(VALUE._col1), count(VALUE._col2), avg(VALUE._col3), stddev_pop(VALUE._col4), max(VALUE._col5) + keys: KEY._col0 (type: tinyint) + mode: mergepartial + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6 + Statistics: Num rows: 11 Data size: 121 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: tinyint) + sort order: + + Statistics: Num rows: 11 Data size: 121 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: int), _col2 (type: smallint), _col3 (type: bigint), _col4 (type: double), _col5 (type: double), _col6 (type: decimal(4,2)) + Reducer 3 + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: tinyint), VALUE._col0 (type: int), VALUE._col1 (type: smallint), VALUE._col2 (type: bigint), VALUE._col3 (type: double), VALUE._col4 (type: double), VALUE._col5 (type: decimal(4,2)) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6 + Statistics: Num rows: 11 Data size: 121 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 11 Data size: 121 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: SELECT ctinyint, + MAX(cint), + MIN(csmallint), + COUNT(cstring1), + AVG(cfloat), + STDDEV_POP(cdouble), + MAX(cdecimal) +FROM parquet_types +GROUP BY ctinyint +ORDER BY ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_types +#### A masked pattern was here #### +POSTHOOK: query: SELECT ctinyint, + MAX(cint), + MIN(csmallint), + COUNT(cstring1), + AVG(cfloat), + STDDEV_POP(cdouble), + MAX(cdecimal) +FROM parquet_types +GROUP BY ctinyint +ORDER BY ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_types +#### A masked pattern was here #### +1 121 1 8 1.1749999970197678 2.0621590627301285 90.33 +2 119 1 7 1.2142857142857142 1.8 60.12 +3 120 1 7 1.171428578240531 1.7999999999999996 90.21 diff --git ql/src/test/results/clientpositive/vector_aggregate_9.q.out ql/src/test/results/clientpositive/vector_aggregate_9.q.out index 7c010a3..f81816c 100644 --- ql/src/test/results/clientpositive/vector_aggregate_9.q.out +++ ql/src/test/results/clientpositive/vector_aggregate_9.q.out @@ -152,11 +152,15 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc +PREHOOK: query: -- SORT_QUERY_RESULTS + +select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc PREHOOK: type: QUERY PREHOOK: Input: default@vectortab2korc #### A masked pattern was here #### -POSTHOOK: query: select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select min(dc), max(dc), sum(dc), avg(dc) from vectortab2korc POSTHOOK: type: QUERY POSTHOOK: Input: default@vectortab2korc #### A masked pattern was here #### diff --git ql/src/test/results/clientpositive/vector_char_mapjoin1.q.out ql/src/test/results/clientpositive/vector_char_mapjoin1.q.out index 824944a..744bfb3 100644 --- ql/src/test/results/clientpositive/vector_char_mapjoin1.q.out +++ ql/src/test/results/clientpositive/vector_char_mapjoin1.q.out @@ -197,18 +197,22 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 PREHOOK: type: QUERY PREHOOK: Input: default@char_join1_vc1_orc #### A masked pattern was here #### -POSTHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc1_orc b on (a.c2 = b.c2) order by a.c1 POSTHOOK: type: QUERY POSTHOOK: Input: default@char_join1_vc1_orc #### A masked pattern was here #### -1 abc 2 abc 1 abc 1 abc -2 abc 2 abc +1 abc 2 abc 2 abc 1 abc +2 abc 2 abc 3 abc 3 abc PREHOOK: query: -- Join char with different length char explain select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 @@ -289,20 +293,24 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 PREHOOK: type: QUERY PREHOOK: Input: default@char_join1_vc1_orc PREHOOK: Input: default@char_join1_vc2_orc #### A masked pattern was here #### -POSTHOOK: query: select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_vc2_orc b on (a.c2 = b.c2) order by a.c1 POSTHOOK: type: QUERY POSTHOOK: Input: default@char_join1_vc1_orc POSTHOOK: Input: default@char_join1_vc2_orc #### A masked pattern was here #### -1 abc 2 abc 1 abc 1 abc -2 abc 2 abc +1 abc 2 abc 2 abc 1 abc +2 abc 2 abc 3 abc 3 abc PREHOOK: query: -- Join char with string explain select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 @@ -382,12 +390,16 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 PREHOOK: type: QUERY PREHOOK: Input: default@char_join1_str_orc PREHOOK: Input: default@char_join1_vc1_orc #### A masked pattern was here #### -POSTHOOK: query: select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * from char_join1_vc1_orc a join char_join1_str_orc b on (a.c2 = b.c2) order by a.c1 POSTHOOK: type: QUERY POSTHOOK: Input: default@char_join1_str_orc POSTHOOK: Input: default@char_join1_vc1_orc diff --git ql/src/test/results/clientpositive/vector_decimal_mapjoin.q.out ql/src/test/results/clientpositive/vector_decimal_mapjoin.q.out index 03eb445..2b4348b 100644 --- ql/src/test/results/clientpositive/vector_decimal_mapjoin.q.out +++ ql/src/test/results/clientpositive/vector_decimal_mapjoin.q.out @@ -1,34 +1,82 @@ -PREHOOK: query: -- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc -PREHOOK: type: CREATETABLE_AS_SELECT -PREHOOK: Input: default@alltypesorc +PREHOOK: query: CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE +PREHOOK: type: CREATETABLE PREHOOK: Output: database:default -PREHOOK: Output: default@decimal_mapjoin -POSTHOOK: query: -- SORT_QUERY_RESULTS - -CREATE TABLE decimal_mapjoin STORED AS ORC AS - SELECT cdouble, CAST (((cdouble*22.1)/37) AS DECIMAL(20,10)) AS cdecimal1, - CAST (((cdouble*9.3)/13) AS DECIMAL(23,14)) AS cdecimal2, - cint - FROM alltypesorc -POSTHOOK: type: CREATETABLE_AS_SELECT -POSTHOOK: Input: default@alltypesorc +PREHOOK: Output: default@over1k +POSTHOOK: query: CREATE TABLE over1k(t tinyint, + si smallint, + i int, + b bigint, + f float, + d double, + bo boolean, + s string, + ts timestamp, + dec decimal(4,2), + bin binary) +ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' +STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@over1k +PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@over1k +POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/over1k' OVERWRITE INTO TABLE over1k +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@over1k +PREHOOK: query: CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t1 +POSTHOOK: query: CREATE TABLE t1(dec decimal(4,2)) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t1 +PREHOOK: query: INSERT INTO TABLE t1 select dec from over1k +PREHOOK: type: QUERY +PREHOOK: Input: default@over1k +PREHOOK: Output: default@t1 +POSTHOOK: query: INSERT INTO TABLE t1 select dec from over1k +POSTHOOK: type: QUERY +POSTHOOK: Input: default@over1k +POSTHOOK: Output: default@t1 +POSTHOOK: Lineage: t1.dec SIMPLE [(over1k)over1k.FieldSchema(name:dec, type:decimal(4,2), comment:null), ] +PREHOOK: query: CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t2 +POSTHOOK: query: CREATE TABLE t2(dec decimal(4,0)) STORED AS ORC +POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default -POSTHOOK: Output: default@decimal_mapjoin -PREHOOK: query: EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: Output: default@t2 +PREHOOK: query: INSERT INTO TABLE t2 select dec from over1k +PREHOOK: type: QUERY +PREHOOK: Input: default@over1k +PREHOOK: Output: default@t2 +POSTHOOK: query: INSERT INTO TABLE t2 select dec from over1k +POSTHOOK: type: QUERY +POSTHOOK: Input: default@over1k +POSTHOOK: Output: default@t2 +POSTHOOK: Lineage: t2.dec EXPRESSION [(over1k)over1k.FieldSchema(name:dec, type:decimal(4,2), comment:null), ] +PREHOOK: query: explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) PREHOOK: type: QUERY -POSTHOOK: query: EXPLAIN SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: query: explain +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) POSTHOOK: type: QUERY STAGE DEPENDENCIES: Stage-4 is a root stage @@ -39,46 +87,46 @@ STAGE PLANS: Stage: Stage-4 Map Reduce Local Work Alias -> Map Local Tables: - l + t2 Fetch Operator limit: -1 Alias -> Map Local Operator Tree: - l + t2 TableScan - alias: l - Statistics: Num rows: 12288 Data size: 2165060 Basic stats: COMPLETE Column stats: NONE + alias: t2 + Statistics: Num rows: 1049 Data size: 117488 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (cint = 6981) (type: boolean) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE + predicate: dec is not null (type: boolean) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE HashTable Sink Operator keys: - 0 6981 (type: int) - 1 6981 (type: int) + 0 dec (type: decimal(6,2)) + 1 dec (type: decimal(6,2)) Stage: Stage-3 Map Reduce Map Operator Tree: TableScan - alias: r - Statistics: Num rows: 12288 Data size: 2165060 Basic stats: COMPLETE Column stats: NONE + alias: t1 + Statistics: Num rows: 1049 Data size: 117488 Basic stats: COMPLETE Column stats: NONE Filter Operator - predicate: (cint = 6981) (type: boolean) - Statistics: Num rows: 6144 Data size: 1082530 Basic stats: COMPLETE Column stats: NONE + predicate: dec is not null (type: boolean) + Statistics: Num rows: 525 Data size: 58800 Basic stats: COMPLETE Column stats: NONE Map Join Operator condition map: Inner Join 0 to 1 keys: - 0 6981 (type: int) - 1 6981 (type: int) - outputColumnNames: _col1, _col9 - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + 0 dec (type: decimal(6,2)) + 1 dec (type: decimal(6,2)) + outputColumnNames: _col0, _col4 + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE Select Operator - expressions: 6981 (type: int), 6981 (type: int), _col1 (type: decimal(20,10)), _col9 (type: decimal(23,14)) - outputColumnNames: _col0, _col1, _col2, _col3 - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + expressions: _col0 (type: decimal(4,2)), _col4 (type: decimal(4,0)) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false - Statistics: Num rows: 6758 Data size: 1190783 Basic stats: COMPLETE Column stats: NONE + Statistics: Num rows: 577 Data size: 64680 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat @@ -93,117 +141,123 @@ STAGE PLANS: Processor Tree: ListSink -PREHOOK: query: SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) PREHOOK: type: QUERY -PREHOOK: Input: default@decimal_mapjoin +PREHOOK: Input: default@t1 +PREHOOK: Input: default@t2 #### A masked pattern was here #### -POSTHOOK: query: SELECT l.cint, r.cint, l.cdecimal1, r.cdecimal2 - FROM decimal_mapjoin l - JOIN decimal_mapjoin r ON l.cint = r.cint - WHERE l.cint = 6981 +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.dec, t2.dec from t1 join t2 on (t1.dec=t2.dec) POSTHOOK: type: QUERY -POSTHOOK: Input: default@decimal_mapjoin +POSTHOOK: Input: default@t1 +POSTHOOK: Input: default@t2 #### A masked pattern was here #### -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 -617.5607769230769 -6981 6981 -515.621072973 6984454.211097692 -6981 6981 -515.621072973 6984454.211097692 -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 -515.621072973 NULL -6981 6981 5831542.269248378 -617.5607769230769 -6981 6981 5831542.269248378 -617.5607769230769 -6981 6981 5831542.269248378 6984454.211097692 -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 5831542.269248378 NULL -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL -617.5607769230769 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL 6984454.211097692 -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL -6981 6981 NULL NULL +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +14 14 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +17 17 +45 45 +45 45 +45 45 +45 45 +45 45 +6 6 +6 6 +6 6 +6 6 +6 6 +6 6 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +62 62 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +64 64 +70 70 +70 70 +70 70 +70 70 +70 70 +70 70 +70 70 +79 79 +79 79 +79 79 +79 79 +79 79 +79 79 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +89 89 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 +9 9 diff --git ql/src/test/results/clientpositive/vector_inner_join.q.out ql/src/test/results/clientpositive/vector_inner_join.q.out new file mode 100644 index 0000000..3e8d2f4 --- /dev/null +++ ql/src/test/results/clientpositive/vector_inner_join.q.out @@ -0,0 +1,799 @@ +PREHOOK: query: CREATE TABLE orc_table_1a(a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1a +POSTHOOK: query: CREATE TABLE orc_table_1a(a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1a +PREHOOK: query: CREATE TABLE orc_table_2a(c INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2a +POSTHOOK: query: CREATE TABLE orc_table_2a(c INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2a +PREHOOK: query: insert into table orc_table_1a values(1),(1), (2),(3) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@orc_table_1a +POSTHOOK: query: insert into table orc_table_1a values(1),(1), (2),(3) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@orc_table_1a +POSTHOOK: Lineage: orc_table_1a.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2a values(0),(2), (3),(null),(4) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__2 +PREHOOK: Output: default@orc_table_2a +POSTHOOK: query: insert into table orc_table_2a values(0),(2), (3),(null),(4) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__2 +POSTHOOK: Output: default@orc_table_2a +POSTHOOK: Lineage: orc_table_2a.c EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: explain +select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 4 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 c (type: int) + 1 a (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col4 + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col4 (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1a +PREHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +POSTHOOK: query: select t1.a from orc_table_2a t2 join orc_table_1a t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1a +POSTHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +3 +PREHOOK: query: explain +select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_1:t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_1:t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: a is not null (type: boolean) + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: a (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Group By Operator + keys: _col0 (type: int) + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: c (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 3 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Semi Join 0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 2 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1a +PREHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +POSTHOOK: query: select t2.c from orc_table_2a t2 left semi join orc_table_1a t1 on t1.a = t2.c where t2.c > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1a +POSTHOOK: Input: default@orc_table_2a +#### A masked pattern was here #### +3 +PREHOOK: query: CREATE TABLE orc_table_1b(v1 STRING, a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1b +POSTHOOK: query: CREATE TABLE orc_table_1b(v1 STRING, a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1b +PREHOOK: query: CREATE TABLE orc_table_2b(c INT, v2 STRING) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2b +POSTHOOK: query: CREATE TABLE orc_table_2b(c INT, v2 STRING) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2b +PREHOOK: query: insert into table orc_table_1b values("one", 1),("one", 1), ("two", 2),("three", 3) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__3 +PREHOOK: Output: default@orc_table_1b +POSTHOOK: query: insert into table orc_table_1b values("one", 1),("one", 1), ("two", 2),("three", 3) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__3 +POSTHOOK: Output: default@orc_table_1b +POSTHOOK: Lineage: orc_table_1b.a EXPRESSION [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_1b.v1 SIMPLE [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2b values(0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR") +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__4 +PREHOOK: Output: default@orc_table_2b +POSTHOOK: query: insert into table orc_table_2b values(0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR") +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__4 +POSTHOOK: Output: default@orc_table_2b +POSTHOOK: Lineage: orc_table_2b.c EXPRESSION [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_2b.v2 SIMPLE [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: explain +select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 c (type: int) + 1 a (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col5, _col6 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col5 (type: string), _col6 (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three 3 +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 c (type: int) + 1 a (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col5 (type: string), _col6 (type: int), _col0 (type: int), _col1 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a, t2.c, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three 3 3 THREE +PREHOOK: query: explain +select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 c (type: int) + 1 a (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col5 (type: string), (_col6 * 2) (type: int), (_col0 * 5) (type: int), _col1 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t1.a*2, t2.c*5, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three 6 15 THREE +PREHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 c (type: int) + 1 a (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col0, _col1, _col5 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col5 (type: string), _col1 (type: string), _col0 (type: int) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three THREE 3 +PREHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 c (type: int) + 1 a (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 c (type: int) + 1 a (type: int) + outputColumnNames: _col1, _col5, _col6 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col6 (type: int), _col5 (type: string), _col1 (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_2b t2 join orc_table_1b t1 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +3 three THREE +PREHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 a (type: int) + 1 c (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col5, _col6 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col0 (type: string), _col6 (type: string), _col5 (type: int) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.v1, t2.v2, t2.c from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +three THREE 3 +PREHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 4 Data size: 364 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (a > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 a (type: int) + 1 c (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 5 Data size: 456 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (c > 2) (type: boolean) + Statistics: Num rows: 1 Data size: 91 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Inner Join 0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col6 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col1 (type: int), _col0 (type: string), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 100 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1b +PREHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +POSTHOOK: query: select t1.a, t1.v1, t2.v2 from orc_table_1b t1 join orc_table_2b t2 on t1.a = t2.c where t1.a > 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1b +POSTHOOK: Input: default@orc_table_2b +#### A masked pattern was here #### +3 three THREE diff --git ql/src/test/results/clientpositive/vector_outer_join0.q.out ql/src/test/results/clientpositive/vector_outer_join0.q.out new file mode 100644 index 0000000..886caa0 --- /dev/null +++ ql/src/test/results/clientpositive/vector_outer_join0.q.out @@ -0,0 +1,230 @@ +PREHOOK: query: CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_1 +POSTHOOK: query: CREATE TABLE orc_table_1(v1 STRING, a INT) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_1 +PREHOOK: query: CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@orc_table_2 +POSTHOOK: query: CREATE TABLE orc_table_2(c INT, v2 STRING) STORED AS ORC +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@orc_table_2 +PREHOOK: query: insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@orc_table_1 +POSTHOOK: query: insert into table orc_table_1 values ("", null),("one", 1),("one", 1),("two", 2),("three", 3),("", null) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@orc_table_1 +POSTHOOK: Lineage: orc_table_1.a EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_1.v1 SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, "") +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__2 +PREHOOK: Output: default@orc_table_2 +POSTHOOK: query: insert into table orc_table_2 values (0, "ZERO"),(2, "TWO"), (3, "THREE"),(null, ""),(4, "FOUR"),(null, "") +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__2 +POSTHOOK: Output: default@orc_table_2 +POSTHOOK: Lineage: orc_table_2.c EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: orc_table_2.v2 SIMPLE [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: select * from orc_table_1 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +#### A masked pattern was here #### +POSTHOOK: query: select * from orc_table_1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +#### A masked pattern was here #### + NULL + NULL +one 1 +one 1 +three 3 +two 2 +PREHOOK: query: select * from orc_table_2 +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: select * from orc_table_2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +0 ZERO +2 TWO +3 THREE +4 FOUR +NULL +NULL +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t2 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t2 + TableScan + alias: t2 + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 a (type: int) + 1 c (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t1 + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col0 (type: string), _col1 (type: int), _col5 (type: int), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 left outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### + NULL NULL NULL + NULL NULL NULL +one 1 NULL NULL +one 1 NULL NULL +three 3 3 THREE +two 2 2 TWO +PREHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +POSTHOOK: query: explain +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + t1 + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + t1 + TableScan + alias: t1 + Statistics: Num rows: 6 Data size: 544 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 a (type: int) + 1 c (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: t2 + Statistics: Num rows: 6 Data size: 550 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Right Outer Join0 to 1 + keys: + 0 a (type: int) + 1 c (type: int) + outputColumnNames: _col0, _col1, _col5, _col6 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col0 (type: string), _col1 (type: int), _col5 (type: int), _col6 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 6 Data size: 598 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +PREHOOK: type: QUERY +PREHOOK: Input: default@orc_table_1 +PREHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select t1.v1, t1.a, t2.c, t2.v2 from orc_table_1 t1 right outer join orc_table_2 t2 on t1.a = t2.c +POSTHOOK: type: QUERY +POSTHOOK: Input: default@orc_table_1 +POSTHOOK: Input: default@orc_table_2 +#### A masked pattern was here #### +NULL NULL 0 ZERO +NULL NULL 4 FOUR +NULL NULL NULL +NULL NULL NULL +three 3 3 THREE +two 2 2 TWO diff --git ql/src/test/results/clientpositive/vector_outer_join1.q.out ql/src/test/results/clientpositive/vector_outer_join1.q.out new file mode 100644 index 0000000..53e37ce --- /dev/null +++ ql/src/test/results/clientpositive/vector_outer_join1.q.out @@ -0,0 +1,534 @@ +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_1:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +-21 -200 NULL NULL -21.0 -200.0 NULL NULL 1969-12-31 16:00:09.052 1969-12-31 15:59:55.451 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +3 -200 NULL -1438142492 3.0 -200.0 NULL T8Uakh8tudd1XRG5yKW8Y42H 1969-12-31 16:00:07.648 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -200 NULL -245476731 31.0 -200.0 NULL 3E3BxP 1969-12-31 15:59:54.739 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +38 -200 NULL -1090414113 38.0 -200.0 NULL 5oQ43l 1969-12-31 16:00:05.478 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL 1576772382 38.0 -200.0 NULL X3Ufbt46AUIfHe 1969-12-31 15:59:49.567 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +PREHOOK: query: explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_1:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +-21 +-28 +-34 +-50 +29 +3 +31 +31 +31 +31 +38 +38 +38 +38 +NULL +NULL +NULL +NULL +NULL +PREHOOK: query: explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-8 is a root stage + Stage-3 depends on stages: Stage-8 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-8 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_0:$hdt$_1:c + Fetch Operator + limit: -1 + $hdt$_0:$hdt$_2:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_0:$hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + $hdt$_0:$hdt$_2:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 17 Data size: 3353 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count(), sum(_col0) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint), _col1 (type: bigint) + Local Work: + Map Reduce Local Work + Execution mode: vectorized + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0), sum(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_ctinyint) from (select c.ctinyint as c_ctinyint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +118 -14 diff --git ql/src/test/results/clientpositive/vector_outer_join2.q.out ql/src/test/results/clientpositive/vector_outer_join2.q.out new file mode 100644 index 0000000..a7b14e1 --- /dev/null +++ ql/src/test/results/clientpositive/vector_outer_join2.q.out @@ -0,0 +1,232 @@ +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-8 is a root stage + Stage-3 depends on stages: Stage-8 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-8 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_0:$hdt$_1:c + Fetch Operator + limit: -1 + $hdt$_0:$hdt$_2:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_0:$hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + $hdt$_0:$hdt$_2:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cbigint (type: bigint) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col1 (type: bigint) + 1 _col0 (type: bigint) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cbigint (type: bigint) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col1 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: bigint) + 1 _col0 (type: bigint) + outputColumnNames: _col1 + Statistics: Num rows: 17 Data size: 3353 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col1 (type: bigint) + outputColumnNames: _col0 + Statistics: Num rows: 17 Data size: 3353 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count(), sum(_col0) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint), _col1 (type: bigint) + Local Work: + Map Reduce Local Work + Execution mode: vectorized + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0), sum(VALUE._col1) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*), sum(t1.c_cbigint) from (select c.cbigint as c_cbigint +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cbigint = c.cbigint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 -1197260954 diff --git ql/src/test/results/clientpositive/vector_outer_join3.q.out ql/src/test/results/clientpositive/vector_outer_join3.q.out new file mode 100644 index 0000000..a8ee829 --- /dev/null +++ ql/src/test/results/clientpositive/vector_outer_join3.q.out @@ -0,0 +1,509 @@ +PREHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1a +POSTHOOK: query: create table small_alltypesorc1a as select * from alltypesorc where cint is not null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1a +PREHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2a +POSTHOOK: query: create table small_alltypesorc2a as select * from alltypesorc where cint is null and ctinyint is not null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2a +PREHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3a +POSTHOOK: query: create table small_alltypesorc3a as select * from alltypesorc where cint is not null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3a +PREHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4a +POSTHOOK: query: create table small_alltypesorc4a as select * from alltypesorc where cint is null and ctinyint is null limit 5 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4a +PREHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1a +PREHOOK: Input: default@small_alltypesorc2a +PREHOOK: Input: default@small_alltypesorc3a +PREHOOK: Input: default@small_alltypesorc4a +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: create table small_alltypesorc_a stored as orc as select * from +(select * from (select * from small_alltypesorc1a) sq1 + union all + select * from (select * from small_alltypesorc2a) sq2 + union all + select * from (select * from small_alltypesorc3a) sq3 + union all + select * from (select * from small_alltypesorc4a) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1a +POSTHOOK: Input: default@small_alltypesorc2a +POSTHOOK: Input: default@small_alltypesorc3a +POSTHOOK: Input: default@small_alltypesorc4a +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +PREHOOK: Output: default@small_alltypesorc_a +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +POSTHOOK: Output: default@small_alltypesorc_a +PREHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_a COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-8 is a root stage + Stage-3 depends on stages: Stage-8 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-8 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_0:$hdt$_1:c + Fetch Operator + limit: -1 + $hdt$_0:$hdt$_2:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_0:$hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + $hdt$_0:$hdt$_2:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cstring1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col1 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + Statistics: Num rows: 17 Data size: 3353 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Local Work: + Map Reduce Local Work + Execution mode: vectorized + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cint = c.cint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +1005 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-8 is a root stage + Stage-3 depends on stages: Stage-8 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-8 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_0:$hdt$_1:c + Fetch Operator + limit: -1 + $hdt$_0:$hdt$_2:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_0:$hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring2 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + $hdt$_0:$hdt$_2:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: string) + 1 _col0 (type: string) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cstring1 (type: string), cstring2 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: string) + 1 _col0 (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: string) + 1 _col0 (type: string) + Statistics: Num rows: 17 Data size: 3353 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Local Work: + Map Reduce Local Work + Execution mode: vectorized + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 +PREHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-8 is a root stage + Stage-3 depends on stages: Stage-8 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-8 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_0:$hdt$_1:c + Fetch Operator + limit: -1 + $hdt$_0:$hdt$_2:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_0:$hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cbigint (type: bigint), cstring2 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col3 (type: string), _col1 (type: bigint) + 1 _col1 (type: string), _col0 (type: bigint) + $hdt$_0:$hdt$_2:c + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cstring1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col2 (type: string), _col0 (type: int) + 1 _col1 (type: string), _col0 (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int), cbigint (type: bigint), cstring1 (type: string), cstring2 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 15 Data size: 2772 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col3 (type: string), _col1 (type: bigint) + 1 _col1 (type: string), _col0 (type: bigint) + outputColumnNames: _col0, _col2 + Statistics: Num rows: 16 Data size: 3049 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: string), _col0 (type: int) + 1 _col1 (type: string), _col0 (type: int) + Statistics: Num rows: 17 Data size: 3353 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Local Work: + Map Reduce Local Work + Execution mode: vectorized + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.cstring1 +from small_alltypesorc_a c +left outer join small_alltypesorc_a cd + on cd.cstring2 = c.cstring2 and cd.cbigint = c.cbigint +left outer join small_alltypesorc_a hd + on hd.cstring1 = c.cstring1 and hd.cint = c.cint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_a +#### A masked pattern was here #### +105 diff --git ql/src/test/results/clientpositive/vector_outer_join4.q.out ql/src/test/results/clientpositive/vector_outer_join4.q.out new file mode 100644 index 0000000..c07b1d6 --- /dev/null +++ ql/src/test/results/clientpositive/vector_outer_join4.q.out @@ -0,0 +1,857 @@ +PREHOOK: query: create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc1b +POSTHOOK: query: create table small_alltypesorc1b as select * from alltypesorc where cint is not null and ctinyint is not null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc1b +PREHOOK: query: create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc2b +POSTHOOK: query: create table small_alltypesorc2b as select * from alltypesorc where cint is null and ctinyint is not null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc2b +PREHOOK: query: create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc3b +POSTHOOK: query: create table small_alltypesorc3b as select * from alltypesorc where cint is not null and ctinyint is null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc3b +PREHOOK: query: create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@alltypesorc +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc4b +POSTHOOK: query: create table small_alltypesorc4b as select * from alltypesorc where cint is null and ctinyint is null limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@alltypesorc +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc4b +PREHOOK: query: create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@small_alltypesorc1b +PREHOOK: Input: default@small_alltypesorc2b +PREHOOK: Input: default@small_alltypesorc3b +PREHOOK: Input: default@small_alltypesorc4b +PREHOOK: Output: database:default +PREHOOK: Output: default@small_alltypesorc_b +POSTHOOK: query: create table small_alltypesorc_b stored as orc as select * from +(select * from (select * from small_alltypesorc1b) sq1 + union all + select * from (select * from small_alltypesorc2b) sq2 + union all + select * from (select * from small_alltypesorc3b) sq3 + union all + select * from (select * from small_alltypesorc4b) sq4) q +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@small_alltypesorc1b +POSTHOOK: Input: default@small_alltypesorc2b +POSTHOOK: Input: default@small_alltypesorc3b +POSTHOOK: Input: default@small_alltypesorc4b +POSTHOOK: Output: database:default +POSTHOOK: Output: default@small_alltypesorc_b +PREHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +PREHOOK: Output: default@small_alltypesorc_b +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +POSTHOOK: Output: default@small_alltypesorc_b +PREHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: ANALYZE TABLE small_alltypesorc_b COMPUTE STATISTICS FOR COLUMNS +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +PREHOOK: query: explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_1:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), csmallint (type: smallint), cint (type: int), cbigint (type: bigint), cfloat (type: float), cdouble (type: double), cstring1 (type: string), cstring2 (type: string), ctimestamp1 (type: timestamp), ctimestamp2 (type: timestamp), cboolean1 (type: boolean), cboolean2 (type: boolean) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col2 (type: int) + 1 _col2 (type: int) + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23 + Statistics: Num rows: 33 Data size: 6237 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 33 Data size: 6237 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select * +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +-10 -200 NULL -1818374653 -10.0 -200.0 NULL uFavNs7g58qrfyCH681d 1969-12-31 16:00:03.248 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-21 -200 NULL NULL -21.0 -200.0 NULL NULL 1969-12-31 16:00:09.052 1969-12-31 15:59:55.451 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-30 -200 NULL -815881183 -30.0 -200.0 NULL B0B5kG3OIl6C 1969-12-31 15:59:44.842 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-39 -200 NULL 944477914 -39.0 -200.0 NULL T8brJ213nd7rhW8XdnB1 1969-12-31 16:00:00.958 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +-50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +-63 -200 NULL 1927856372 -63.0 -200.0 NULL v6mk2b7oX 1969-12-31 16:00:06.852 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +3 -200 NULL -1438142492 3.0 -200.0 NULL T8Uakh8tudd1XRG5yKW8Y42H 1969-12-31 16:00:07.648 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -200 NULL -245476731 31.0 -200.0 NULL 3E3BxP 1969-12-31 15:59:54.739 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +38 -200 NULL -1090414113 38.0 -200.0 NULL 5oQ43l 1969-12-31 16:00:05.478 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +38 -200 NULL 1576772382 38.0 -200.0 NULL X3Ufbt46AUIfHe 1969-12-31 15:59:49.567 1969-12-31 15:59:55.451 NULL true NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +8 -200 NULL -1236645308 8.0 -200.0 NULL M28wJxOvunO3EImapE7OApQ 1969-12-31 15:59:46.007 1969-12-31 15:59:55.451 NULL false NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -11 -15431 528534767 NULL -11.0 -15431.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:52.176 1969-12-31 16:00:07.787 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -28 -15813 528534767 NULL -28.0 -15813.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:55.787 1969-12-31 16:00:01.546 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -34 15007 528534767 NULL -34.0 15007.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:50.434 1969-12-31 16:00:13.352 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL -50 -13326 528534767 NULL -50.0 -13326.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:46.674 1969-12-31 16:00:08.875 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 16 5780 528534767 NULL 16.0 5780.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.451 1969-12-31 16:00:12.752 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 27 -7824 528534767 NULL 27.0 -7824.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:04.963 1969-12-31 15:59:56.474 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 29 7021 528534767 NULL 29.0 7021.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:15.007 1969-12-31 16:00:15.148 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 -9566 528534767 NULL 31.0 -9566.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.187 1969-12-31 16:00:06.961 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 31 4963 528534767 NULL 31.0 4963.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 16:00:07.021 1969-12-31 16:00:02.997 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL 61 -15549 528534767 NULL 61.0 -15549.0 cvLH6Eat2yFsyy7p NULL 1969-12-31 15:59:44.569 1969-12-31 15:59:51.665 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -11534 528534767 NULL NULL -11534.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:55.407 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -3012 528534767 NULL NULL -3012.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.756 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4016 528534767 NULL NULL -4016.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:07.209 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -4213 528534767 NULL NULL -4213.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.589 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -6147 528534767 NULL NULL -6147.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:13.839 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7314 528534767 NULL NULL -7314.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:06.913 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL -7680 528534767 NULL NULL -7680.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:11.525 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 11254 528534767 NULL NULL 11254.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:03.151 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 13889 528534767 NULL NULL 13889.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 16:00:00.423 true NULL +NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL NULL 3321 528534767 NULL NULL 3321.0 cvLH6Eat2yFsyy7p NULL NULL 1969-12-31 15:59:52.967 true NULL +PREHOOK: query: explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +POSTHOOK: query: explain +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-4 is a root stage + Stage-3 depends on stages: Stage-4 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-4 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_1:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 33 Data size: 6237 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 33 Data size: 6237 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Local Work: + Map Reduce Local Work + Execution mode: vectorized + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +-10 +-11 +-21 +-28 +-30 +-34 +-39 +-50 +-63 +16 +27 +29 +3 +31 +31 +31 +31 +31 +31 +31 +31 +31 +38 +38 +38 +38 +61 +8 +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +PREHOOK: query: explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +POSTHOOK: query: explain +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-8 is a root stage + Stage-3 depends on stages: Stage-8 + Stage-0 depends on stages: Stage-3 + +STAGE PLANS: + Stage: Stage-8 + Map Reduce Local Work + Alias -> Map Local Tables: + $hdt$_0:$hdt$_1:c + Fetch Operator + limit: -1 + $hdt$_0:$hdt$_2:c + Fetch Operator + limit: -1 + Alias -> Map Local Operator Tree: + $hdt$_0:$hdt$_1:c + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: cint (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + $hdt$_0:$hdt$_2:c + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint) + outputColumnNames: _col0 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + HashTable Sink Operator + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + + Stage: Stage-3 + Map Reduce + Map Operator Tree: + TableScan + alias: c + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: ctinyint (type: tinyint), cint (type: int) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 30 Data size: 5670 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col1 (type: int) + 1 _col0 (type: int) + outputColumnNames: _col0 + Statistics: Num rows: 33 Data size: 6237 Basic stats: COMPLETE Column stats: NONE + Map Join Operator + condition map: + Left Outer Join0 to 1 + keys: + 0 _col0 (type: tinyint) + 1 _col0 (type: tinyint) + Statistics: Num rows: 36 Data size: 6860 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: count() + mode: hash + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + sort order: + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + value expressions: _col0 (type: bigint) + Local Work: + Map Reduce Local Work + Execution mode: vectorized + Reduce Operator Tree: + Group By Operator + aggregations: count(VALUE._col0) + mode: mergepartial + outputColumnNames: _col0 + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +PREHOOK: type: QUERY +PREHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +POSTHOOK: query: -- SORT_QUERY_RESULTS + +select count(*) from (select c.ctinyint +from small_alltypesorc_b c +left outer join small_alltypesorc_b cd + on cd.cint = c.cint +left outer join small_alltypesorc_b hd + on hd.ctinyint = c.ctinyint +) t1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@small_alltypesorc_b +#### A masked pattern was here #### +494 diff --git ql/src/test/results/clientpositive/vectorized_context.q.out ql/src/test/results/clientpositive/vectorized_context.q.out index bd6c127..007212e 100644 --- ql/src/test/results/clientpositive/vectorized_context.q.out +++ ql/src/test/results/clientpositive/vectorized_context.q.out @@ -87,14 +87,12 @@ select store.s_city, ss_net_profit from store_sales JOIN store ON store_sales.ss_store_sk = store.s_store_sk JOIN household_demographics ON store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk -limit 100 PREHOOK: type: QUERY POSTHOOK: query: explain select store.s_city, ss_net_profit from store_sales JOIN store ON store_sales.ss_store_sk = store.s_store_sk JOIN household_demographics ON store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk -limit 100 POSTHOOK: type: QUERY STAGE DEPENDENCIES: Stage-7 is a root stage @@ -164,23 +162,20 @@ STAGE PLANS: expressions: _col7 (type: string), _col2 (type: double) outputColumnNames: _col0, _col1 Statistics: Num rows: 3675 Data size: 372517 Basic stats: COMPLETE Column stats: NONE - Limit - Number of rows: 100 - Statistics: Num rows: 100 Data size: 10100 Basic stats: COMPLETE Column stats: NONE - File Output Operator - compressed: false - Statistics: Num rows: 100 Data size: 10100 Basic stats: COMPLETE Column stats: NONE - table: - input format: org.apache.hadoop.mapred.TextInputFormat - output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat - serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + File Output Operator + compressed: false + Statistics: Num rows: 3675 Data size: 372517 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe Local Work: Map Reduce Local Work Execution mode: vectorized Stage: Stage-0 Fetch Operator - limit: 100 + limit: -1 Processor Tree: ListSink @@ -188,7 +183,6 @@ PREHOOK: query: select store.s_city, ss_net_profit from store_sales JOIN store ON store_sales.ss_store_sk = store.s_store_sk JOIN household_demographics ON store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk -limit 100 PREHOOK: type: QUERY PREHOOK: Input: default@household_demographics PREHOOK: Input: default@store @@ -198,7 +192,6 @@ POSTHOOK: query: select store.s_city, ss_net_profit from store_sales JOIN store ON store_sales.ss_store_sk = store.s_store_sk JOIN household_demographics ON store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk -limit 100 POSTHOOK: type: QUERY POSTHOOK: Input: default@household_demographics POSTHOOK: Input: default@store @@ -304,6 +297,5981 @@ n3ner11ab4 NULL r17jGvc7gR NULL 5G1Xp277YJRklEO5kHx NULL B78T0SnxlCe5AQ522GBUf6c6 NULL +yRtwkNoJ5b6x0HJ0fxP NULL +XA0uP5c61MU NULL +KcGTq8B5161je52Gm NULL +U83eH0Y8P1 NULL +AiTECUywimGFu071n28A NULL +Qdb2N3CC1LwlHy6uljrv NULL +K2uHR7U36540Kx6tC NULL +cOCa6w8Nk34tS1g NULL +S0LP25K12US3 NULL +Y1gVqivH NULL +8Jvom23dkWvvqv81DY5Ub3 NULL +o4N6pL88S2G2p78 NULL +DWxOD6Dlkiw3O5FfA0K NULL +18330cCeptCu564M15 NULL +MDKi1SBx5l6Sb NULL +DHy1oyJ2887Mr5 NULL +hYH6n1Js NULL +CP1IS NULL +es103bnsOVpy NULL +6G82mK8omEjd NULL +545Gtyb6TO01J NULL +sHiDp5LgPyNE4m2UJ4 NULL +osFqC3JV6i1rRxe NULL +07rw6mP4WPoYcTNy1R NULL +8Nj7qpHBTH1GUkMM1BXr2 NULL +OQj5VtJ6ckRaiyanP15Es18 NULL +Li0KjRXWmaO1emA1b8EB NULL +vsX2f2YM0vC5E21f1 NULL +8v3WfTYF315bFL NULL +gXu3tUhVtYp NULL +XJtfPtv77 NULL +QmLnREo0ilui1XsaM4MYp NULL +Iv4nCgiva NULL +5yInU8IMwclXc2 NULL +7ADE3U3HRd8aCc NULL +PWAPwbw NULL +Iit87iX NULL +uY123ioA1pjD4Ife5M NULL +28KA13CH50X3tB0 NULL +8X8meHq2tUPTeP NULL +GlCK4Dw7uIb1bsY NULL +Y1vK3 NULL +NULL NULL +6po0G2233TEv NULL +5OtqBAUJVYmw824aXp7 NULL +prt6lty28No8xni NULL +mTHOSL7l33D0gA27F5k2N NULL +p35H22v36j NULL +50f35 NULL +x8IaCF6n4u NULL +Sf0Oqe1G NULL +XyG3M688p4eP46 NULL +vYn2xNo5rSob8 NULL +8v8D0Sfhscn45vBdn6H NULL +4Pv3ny42Wj23L NULL +GCq73lyB3wuOCajYs NULL +P23cQyt NULL +Ud5G4 NULL +6CwqchP12fO3J5Y NULL +8qVY4hgVfu4JW41cTi NULL +1ev82P6 NULL +55xSuTYE4361 NULL +s3N6cRHTs54 NULL +g7eEN741 NULL +wyxhxSCxs5 NULL +34N4EY63M1GFWuW0boW NULL +y7ttv82TY20M7x170i NULL +Ja872lhYn6T31tPIOB85eb NULL +3w6XYq04J0Lb3Sv82eOV2HJ NULL +XWuYuk5qpn5Khs3764E56 NULL +ci2PQIjy8yUPk7es2y5yg2 NULL +2oSudUNUX6 NULL +7bD30suWFdI4o5Jp6m NULL +VqxF5T5p2bx7R1d4DB NULL +Kft68MpoAc4tLMS2ck3 NULL +wiMnfM1vb8WE0427eQ5Y6oJ5 NULL +rNGcxI3PkU2K NULL +7V65Eih84lc86QMJ2O NULL +TYkMYn1v6giCqpy30s NULL +4mL72FdfnCuoExb NULL +121307nh6r0H31Mg NULL +lBfuml5BYkPete7Tia1clW3 NULL +Vp5I58Cls2jANj NULL +YPJn4lAy8rr58 NULL +aY3tpnr6wfvmWMG0U881 NULL +kC6ti7sn NULL +KjAOvl4yBG7Rw7d NULL +EUl4i NULL +X7V01RlgoCPC NULL +Oj17D50M3suPXf1J22R NULL +x7Tc841 NULL +30J4VggeJfk6l24Wj3Q28 NULL +qXkCSvqa7dOILqMwr6V NULL +swXIs3182y1 NULL +74DT3mMTYm2eEjo3 NULL +suoqdh NULL +802oI1 NULL +J467JW NULL +sQxf42aO2QdVO4glN0 NULL +10TYIE5S35U6dj3N NULL +4i11T6y6lT4073XW46yaalO NULL +MjLlK02ifGBIrla0EE NULL +J8p4pS3A8G75Ct2 NULL +6cb4K60F1fHx0BTu2 NULL +dYeh5IM0vISxwv NULL +VTJ74SnX0NTD2P234T55P5J NULL +6h6Kk4v030PNPj3Kc NULL +2j6rY0poRw58s4ov2h NULL +LkREl5A05DK6wq3YlrRn01j NULL +1Iry1n1c NULL +vmD7YLtKX0c4y2uU NULL +48s0Wy10k NULL +Qgoscb7 NULL +SgVxsU2832X4w NULL +NULL NULL +2V1uLd04r0RYwOkCb4M650 NULL +A1h6G3bgyRxxvyhyWhVL NULL +5Hc2Yn58 NULL +h00AaUR4T644OOB NULL +4Mk3721iRh6 NULL +fS3f60E1s NULL +MXefAh62BQEYn6T54AuUf NULL +eBRuEI2 NULL +d1158gMS8i68jPb2v3L NULL +2W4Kg220OcCy065HG60k6e NULL +a1N8y NULL +10 NULL +8cC24gh NULL +igMQ8 NULL +G6KW4uOD55dfWK NULL +O5hC1xAT0EgNEke1U2a NULL +A43eyp8856SP83 NULL +pm52t42Yfhm NULL +J637uL7i0V6x NULL +DPdyR NULL +DglR0T NULL +1NHb6w5M3W NULL +60KqhA NULL +7L507r40AX3T6mHaO8 NULL +gVS43C76q67h70Yi NULL +NIp47 NULL +Sm7i8BB NULL +6tEhc2NS7268Tmn2E NULL +73m0kME31orwbJhm4 NULL +Y4bpC53ea4Adxlo NULL +V630OaEm NULL +28os423 NULL +K8TPbdRi7X5jHjOVXe30S31 NULL +f8bmVVkEd2TmeFy7wKq11 NULL +4GEqmyTpaQ NULL +5C26Uu6I1Dd7e1xcwSi0FR0 NULL +ferMX1t NULL +EThN3q3g4GbNl1hj1DI6M NULL +OUUn180cqH5Gf1sO NULL +0Y641jaPl NULL +Dtlr84bf14YfQ NULL +2gaHj NULL +A6F00275L4jx8tNc NULL +iINw0m NULL +TxE436GJgq7 NULL +4I23s0o7xIji73bi3y74T5ql NULL +2bV4kSyKcoqKqgO6iXsE NULL +34vL40uLcr11po3k NULL +2Mu6L0wVGTbTT062fEPi6 NULL +3FD2bt1EIaA0YrK NULL +TBj2D5CqREcC5 NULL +M3e586V3688s64J7j NULL +8U0bLsWq8444DJ5TW NULL +RigNg NULL +uD02Qi4 NULL +7X8C04JN7LRyG NULL +Ktp44q NULL +78Mf2pj8fKk5Sq2L8 NULL +2MXQgy3CnV528om4I77x51i7 NULL +4hMaavAE NULL +X7dqPo6hTvhF4 NULL +Pcj70ddpJ0iD NULL +4k1RqRL NULL +ICHiqYG8Uj NULL +I8xs313m1Nk0aC4ofVyYV NULL +oA5OK2dVknje1w7uS3862Da5 NULL +4Mn8007R4LoxG NULL +c81L2dm5Ly68S6H36M6o NULL +5uu6IvJTmY8N85kdnn NULL +CtU2PW66tBCk0swxglxDIp2F NULL +13AA4buw5j0xj33Fie0FAl5 NULL +NULL NULL +vAHn7p7mxOGYk30547 NULL +6e5Vk3f3pMdefo NULL +A4T1b NULL +s1q74N5JbQBuw23 NULL +YXy2ny NULL +1BA21MegTTKR67HG3 NULL +Wbf0Mio NULL +BhVBA NULL +mkFVHkUKg0EeGniwr NULL +5oUu102B4tP7 NULL +USRi4RC1gq NULL +8RYSCOw18284ncYbFjG2kq6 NULL +1kYyjHtA0 NULL +kbT07u8ct NULL +cvqc36vwri7R6kbXKO NULL +shMOr3b8w1F4F38D4wih0 NULL +5snabe7BNqKyRv3Pel77rG NULL +0KX8Y7a660sb NULL +8IlM1oJ7KSGx6hU7i6 NULL +3StDSaH7 NULL +SuXw5fsNLcQuca1uWkJ150 NULL +6Mf2X0s3 NULL +e15NrPMW0E8yCvPO4DN NULL +k552ySnmJE64PBfOx NULL +0o5aasUct374Q NULL +csb2ufhCB NULL +JC6BaR5i7 NULL +lGH86TmJ1c7L7 NULL +u8aUOdI0tuGW6xmxsKM18l NULL +4uu1N8OXG4R0gmj0hPf41 NULL +OGXnr5s0B NULL +LXs6Xx05R8n6Yg NULL +5bd5T5FEdOrYRW00bvs NULL +pWxC5d20ub50yq8EJ8qpQ4h NULL +1If2J08V08IqLbDcOc184k0 NULL +3cT82 NULL +f2IpQuEKjVlAdLrmeSqeH8 NULL +U70UOCk8B7pI7k NULL +LADu77ed6bPf NULL +T3D1O22bKcQigRmWhE5iXG5 NULL +Exp3Ic8q2g8D2i347 NULL +2M106hVFEhu NULL +u85A6B NULL +74nRe6WYOO7MD7632BOS NULL +H68KPMRgSB70 NULL +YX250 NULL +Jqk7D0nwmvre2d1AnH8qL5vl NULL +6JLTA0I2Jx60HU470LO NULL +E1iWm444b NULL +UtriJV4U5N2J7M NULL +2n2cwjWAp2R56c2GYtKHQf0i NULL +8xML5SQm27gN NULL +R2ps2rO NULL +SR1wh2Rpe17Y4KosS64FNh NULL +wLm0KO7A8v2S88GbFqMvP4 NULL +hKX47YOR NULL +ov5xeO NULL +pBO8hHxcSeJh28 NULL +tjRnqs104Dh NULL +h00VUsWU6m0j8OkrJ58l NULL +dw0MWNGD4iGKowp8qa8q NULL +3e0MAK75O1V4Vw2mNM1UiX23 NULL +3Bm0J3xwvp NULL +P5X6554E66k NULL +4U4HK NULL +3C487cjRTM14 NULL +05YFCwrpOl NULL +DVv6SE NULL +43q1I1xa1G33UlA34D4 NULL +ViqXS6s88N1yr14lj7I NULL +NULL NULL +y73GPRsySjy0HnrB7lqc NULL +WUQQRWTJ1wK1H4 NULL +n1niR NULL +75UKgd NULL +bV7F2d53o2Aj6Ri2x2c NULL +e7sC5M0H5K6EgSTf41X NULL +QiOcvR0kt6r7f0R7fiPxQTCU NULL +5x611H4wu3oJ8WU5Rma NULL +gcGG4GVX7MxDB50GG7Mk NULL +86P27LE NULL +s35DFbF4L7JFT2nxagd8 NULL +I357kVmhkel010Hs16 NULL +o6kKvK7SDJ6 NULL +6Pkr6mt6rI3Cno71h1EPb NULL +E4JEjNiE NULL +w2FFs00 NULL +6xm3103e5OE0C82nL3G NULL +kO8y0AlGU5DcV NULL +w13G1635lvs30qJavVn NULL +G2P1ogIIyMgo6j2a27egS NULL +yW5M2tWxQ3NHs1 NULL +d8W5CN1kB6O6ovPhy1C3M NULL +WGPA8WlP5X NULL +jwJSacwHvE75w1OX8tWUT685 NULL +IICO3W NULL +3mQI8u6Qx0sf2b03t86084 NULL +053saXP1gR5mg06644Qd NULL +g4dmKe2yoPRI8hBGgLdStl NULL +806X4jKS0Lo7cO NULL +I6FvRp84S2UGHl8orYl NULL +evAKb23 NULL +e8HP8Yt7uoB NULL +yif2md2VvY NULL +n2nf0ncE1Vj NULL +86o66 NULL +EAP1B57a5132algoul51 NULL +F4FgvW2v NULL +8mo3htjWw1Pxd8A NULL +7BojnC3DIBmmGo8 NULL +37sehiO8Ivl64meKtR NULL +LT14Ev NULL +IIX7QoB77864R6qOfLfhNJI4 NULL +o7H1gvt5G6 NULL +h2Sf5Q335KntN1ee1WHT NULL +7827246tBw33 NULL +3wlj3rr4GuYKMG6QxL64jT NULL +14fnT7A11Y6fE NULL +TgS6dAlI2w4y NULL +F6Gfb3iU850A NULL +636WDH0 NULL +MWoHbU5I00oL7X86882y8cou NULL +KCaXaJvGKfj1tr NULL +HP824Y7lQ7bvAhrEx NULL +2Q032bA7kXvFD0bhrGftiH NULL +vA254Q0K7g NULL +HjA52J2d64r1fFmBITy1 NULL +34P6jvO10s66T30S NULL +12yT2agBjx3yQ NULL +Kw7fOuw4DHeyXe2yg NULL +npJMhV2W NULL +84HS58kw8B32q717TMOCYKx NULL +30u668e NULL +N6BMOr83ecL NULL +Mn25o4t044QATs NULL +fR7eEX2v1LPkujF NULL +GEwSJy0Bk1KRf1JxHqY NULL +o78FOQh4Cb NULL +p77RYLpx2u NULL +00PafC7v NULL +3N1o1bou84BHA70 NULL +2X0XRt20B70F7B NULL +NULL NULL +UA0H368kj NULL +i1P3Wlat5EnBugL24oS4I3 NULL +fkA37sOkxCp44hlIKV NULL +rLL8VlwJ0P NULL +oOt2v NULL +ppK2D7Hurv4FEpES74 NULL +6GvBv4565ks NULL +R4e7Gf NULL +jB2kAo4v NULL +D5sR4yKd NULL +71027fBh8760gbL7aF4K NULL +joGkYdX15A6cN817 NULL +PnD8l5 NULL +37p34Jc2nloL NULL +L417R4I8nG6Mps NULL +bXQMX15tRQ8PeY0jg NULL +53VR1 NULL +c23S6Ky4w7Ld21lAbB NULL +Wp8cr NULL +2g07108CQP0nN6tb NULL +jl5M2Qq7UtWTskD NULL +60fNYu4mIaX7cI4y NULL +pL1580vvAty5r14o4OOo6 NULL +L0MMUTo8C5rj NULL +Ytgl8 NULL +ss NULL +t56OaG NULL +JogdA3We8QF5qf65v1 NULL +gfML7L7et NULL +B8SW6aM7KrJe07p NULL +n6LeJk NULL +b7tPXCg67lmmr NULL +0OHV13 NULL +xjk22HQH0F0E161 NULL +77Xe27p0 NULL +Xe01mh1Ku5BD NULL +cb33ksHDf3lMrp0OW4dMdvos NULL +H7EiGb70 NULL +1M4eTm8OcOW2dAMV2V5slS1 NULL +j1lyplu58dBa NULL +3yeq763N NULL +i80O3j8a8nd0ohVCHE2oVs NULL +ah6jo34tl NULL +3R68Yksg5JRtKk NULL +fbR231f NULL +e6F51mDOrN481rfhqk67lF40 NULL +W7mug7eN NULL +aNuMW2 NULL +lBoQXomNtF2131ymAFCB NULL +3o27DtX883 NULL +X4t00BhQ7X376hiL NULL +fDT36nHCL182d2buS0P NULL +pQ7nxHn7Yl4avHfP7 NULL +BIV45xaS7N41bFOEk0EI34 NULL +84L7MdH7 NULL +ugwHoBG4yXt5uEB NULL +3HhL08q56583 NULL +L4nk83x6pU NULL +04q7g1Qm8cvCmny4S7r NULL +i0CT7RF71a67AT2RfOW32 NULL +xiU8sjtepb1X0LdiN5oWmb NULL +k7i5RkMq88H0s NULL +IW8oEsDH0V0rY5U NULL +61shR2LjQ NULL +W4MsK1d70i NULL +V04OvF27208o NULL +QOwp866GD0E0g3nwq NULL +sU1VhRD0P3w47WU66 NULL +DqpcjoX3m2h4hj4721T2M NULL +RY01bhu1p0G NULL +1W0U2Bpb NULL +NULL NULL +fN3OH7lI2iTEW75Cq4 NULL +O656pe22AVUYD1OG8O4 NULL +4x1067604ekVjosSK5d2umw NULL +48GqfHPFLUxk42ov2bo2mmjq NULL +V57x8Ma3SD2eM877o5 NULL +nF0c6J04lo3lD0GhK8b7n3g NULL +TjA21WuE8m63UJis51Y NULL +4MUYUYLAD7d0lk70NJjc6LB6 NULL +k3GuA6TkIg322clu8v55qt NULL +Qcgkl434Q8113uls NULL +nSa8Lur3OP NULL +eN62nb NULL +hgy7Y NULL +IifFS03pnGO NULL +wP18V45lb74l NULL +G86cmDjPo3 NULL +l1Syw NULL +7uhFTn8OiQ NULL +5ps7e8 NULL +34o2M3 NULL +h1xHE NULL +Pe8evPIv2Q0nM7 NULL +2yK4Bx76O NULL +JH051GV4O3FyM7 NULL +N5sqt2k NULL +YIxsR NULL +5RSKya5o4bhQ NULL +48xYJd1 NULL +vG0u7vdbry6JR4K4B743G3 NULL +3cQp060 NULL +75nB4HFf6o8qwf7gRdfNL NULL +4fSnp6 NULL +4L44FU3D3OA0FN4y NULL +R8EqThU NULL +tK61Btt3Vqln1aL8R NULL +14I0G813dY7 NULL +54T2y NULL +rNQc0BIm7sXFm NULL +nbcHJDu3 NULL +Cw412mnXhN1F NULL +w1e0uUD0wHF0W8 NULL +hX1uXs3XerL24PgMqj0 NULL +pL1XV15rmv2tp1g84 NULL +UfUD41M7m NULL +IXMkdqJHU46dVte76I3Cy36m NULL +ww2aeX68X NULL +5SE7y08pr6GCv576W8724G2V NULL +FO81NX2MQ1Tv2 NULL +p34e30llmRd014J10sp NULL +X81pl2c1Y NULL +xOjXs4YxT7sGOtEDP3l8HBN6 NULL +XeI6xQ2v1E NULL +Osyki0P18kNjc2k5 NULL +jKNJ3m5Bo6w NULL +lo8y7 NULL +bU42b017V0K1G5v1L3B NULL +h6a7neMIjQj81mHy43orcR1 NULL +f6WR6jF NULL +T0Gq3D4N50YY48AG8OQBqTU NULL +ac38VdOhD4a0 NULL +S48lTs10R NULL +6Nv48811uGNPQ188I8o NULL +R20lxgp NULL +4HI5bS2f78nG4Ig1l7 NULL +38XES7ME0108oTOlH1I7BiWn NULL +5h04mA3qHKIDx05St0NNx NULL +QS5W14A NULL +2MCek73Rwx NULL +85cpPHm5B0GD NULL +Gdit38HC7PGtq6N32F7m2 NULL +NULL NULL +1t2c87D721uxcFhn2 NULL +65g3I051uQt48Hrs NULL +4Cf7gWmeh3Gw3bHx50iT2 NULL +KJmChr2CEaA NULL +Y5u0Yy NULL +XA4u0uf7 NULL +886wwGvXf6 NULL +1R480AiLgVaTEIcn3hUy8X NULL +ON30Mh8A8 NULL +N8222wByj NULL +8Pa8a8MJ24 NULL +H7KCa0l6TRDuEG0 NULL +thN7LFe7EQ5A74m3s0 NULL +ktJI200FR0TY4Oq NULL +uyqxYc55plU0CDE5715pT3L NULL +5NWKJdl8j26 NULL +2848p1S1240 NULL +31H4o7hC07b NULL +7LdfF1415i51qpmHQI NULL +2C1S7MUYL5NWPARvQU NULL +8iHtdkJ6d NULL +thdJS602TWQpuNxcpWwk0 NULL +8l433e5J6I0fj0PM NULL +b4ntuTq8cuj0E66Gakn NULL +MFH46gf1UMw2xqJS6VO820 NULL +o6Fy74 NULL +5Y2H4C4 NULL +451H003P8UYu2 NULL +pJ8yNFwgS57SUhSORhpcu NULL +CqdMb86r52TC3NgM187 NULL +C3rew41 NULL +bbdu1ap5 NULL +FdnoO3o3TWb NULL +42HiN0uMiVuj0Dc NULL +wjSgfSx20C2PLsRVEgmB NULL +WnN1oFEwhY4Heri3J7Jp8St NULL +678iebWrL34TlW1 NULL +V5O0Paqve81yx8E223UpK17 NULL +OyQm637Y8T5223y1Ha20q70G NULL +4RpFMC366k71GL1j5Xd5 NULL +2dU734cvN0P2k65CE NULL +iD4A3pEIP5pkv3 NULL +B350G70tUHdR4F5331F NULL +H3Nyq7H1t221 NULL +5BkJb NULL +xqCQ2heer77 NULL +rQHT5hx NULL +LSGQPxLff8bpk NULL +Bg2B3Pf88p NULL +f448c4T81BR NULL +QjASi0tbFqIACJ68VtCYwh NULL +0YAn3Qyo NULL +2QYq8Y NULL +Ej05nrdc8CVXYu1Axy6W NULL +6Dnq5hvbkk NULL +3pOa05vw4J NULL +SimYF0Eg747f7 NULL +8Y7yHw NULL +xA37f0CS8837b3uDhW7IJV0 NULL +W8515aW82L NULL +5UbQg8TK4M8M71HeMyjKE46W NULL +KXvq4OfKW641X0d4WHM2md0 NULL +2eJegODpls2LBS2vAFl1OvQ NULL +58hP5c4e3S68K72k1tO1Edw NULL +07E7K7b8A20SU0y1Dls8ph NULL +SAMSy306XN58JWyyg4KO442i NULL +Bu1QtYr5sfcMxyD2c650GW NULL +SCh73 NULL +0K68k3bdl7jO7 NULL +AfW67EWaHMIQ7yvfqHRUwB NULL +D300Wwybt50R66GNV NULL +NULL NULL +M5857hgh7234V88EX NULL +hCwu446fq4108mQ4x62Pr NULL +Sg1FGtK367wF7noky2 NULL +jc2uH8nPb5K4F0eC NULL +828DT2lU8KStt674pGctB52 NULL +8F3j56 NULL +3es7qU4J NULL +7M515cSr37Sj NULL +r54ce NULL +u5K53cKrE4SIUSqmpc5rnMTO NULL +wVwuQ6dkmkcLxtfK8haA NULL +h2rkj7jL NULL +tKyw2O2N NULL +gcnk28ttRLv13O3ms6p10y NULL +BLyBF45iOWdg58oNy NULL +uBJM330bq073SLH8k1mi670 NULL +ffT4cTjYf2NJ NULL +oE25GuI6446Hq06G4f NULL +dq1Ji5vGb4GVow42 NULL +0g852B NULL +3vsY0 NULL +mc3NjQOr14RVi NULL +e8Yq6dHfa7d61IgPcKrO NULL +EXWsAOlGYtb053ExF6u5FLyb NULL +sq31ri5lya5Spm NULL +O3k76JCgFN83d58REWNvt243 NULL +8x0kI0603QJ6sd0404n NULL +q2bIHkxaKKv7uD NULL +8wc23uR13Fu23GVUp NULL +CoMlAAYdRSe NULL +gtulO7xHeSn NULL +l01UYMiq51W8G4LJtEp86mD7 NULL +GbRXDIgHx85Lc2I4F4Gfuby NULL +K31Po8dhUXDBDt NULL +5d4rPb72As3cr1UU04go8 NULL +10Wu570aLPO0p02P17FeH NULL +JVCOfSTVb NULL +euuqs32N6R4266A NULL +cXX24dH7tblSj46j2g NULL +b NULL +Ph2xOHI4 NULL +H718V0l3GE1fI06Kfs NULL +704TqKdO554m38WDk0W2g NULL +72PfIF567Op NULL +0CkUHn44bl6xbyYLk NULL +r7JrMe NULL +278v67J NULL +73yDbT5WqsMNEB7FmJ3h NULL +U3pW0g NULL +QeIDu0qC0H6kRKlqVGe36J NULL +g243G86C2uHdC38K NULL +00iT08 NULL +b8Gy2h4Svch4dC84a NULL +Sd20gdOoONPhK2OX4 NULL +Yts214m8mDhRw4F2d56 NULL +1324Nbqc0C7h6niurp77wT NULL +Bq245sjauEPf NULL +0AaJ5c3bS7m2i NULL +7x1m6Q06VGAwOm34m NULL +a4frS6y6Q83Q460cwK2Tp24 NULL +0xhsgG3Kg141Yy4dG1 NULL +62JFFg7GbAn1 NULL +4W6pl6oLfgN0ax NULL +M76D058tDDD25v3g NULL +4SLME5xxs7k NULL +1JGq6EC86Lc67B NULL +D5SANA44B8Jm NULL +5K4lM3GNCDNNA4H5H NULL +nVp18XV4iVW217Vr4hb NULL +74xX6fg NULL +IFDa6Y1D4JuF50F2su708Wt NULL +NULL NULL +4LQe2Pd4m640E58XFA NULL +qDPElvv37s4rDkebaA NULL +Dtsb7s36eASJVh1Xi32K NULL +nB447HIddvM432oh7BW61x1 NULL +jXQPXUOT6OR75ChPwBr NULL +40PQ82QY6 NULL +33cr1j NULL +8PpV88OGb NULL +ibR7QuG2aL3O NULL +q0YasY0Y17250cD NULL +gqgj30mc6Sb2aY8chi4 NULL +p8CvcP7et NULL +060EnWLmWE4K8Pv NULL +O7mH0141NeSt21 NULL +XtF80FdC1a3Uw22G6GIPr NULL +61A6n4nFNN1VFalcB NULL +LrOMx3GjUHE614W7s36tp NULL +3gubGh4J18TV NULL +A4Ja7hpu3tCJx82 NULL +12YH5vxufod8Wu1R NULL +6tnH37n7Ow3sLtJBwoGs NULL +nuKKHi NULL +bUAbw6cKb8gjLj7Kf NULL +2G6B67cu1BUqRd3I52Ug20 NULL +3SaS218squQ6hlv5H76M0C7p NULL +2E41VxRBT043Jn6Ggf4no0O NULL +nuIwy NULL +nvj0X NULL +MmMPCF2 NULL +76VqjvX6hmnmvmDWOa8wi8 NULL +KM06o1 NULL +HA1yh NULL +0S3XIH2NDeS0xS NULL +2Uxl6l5oEs2Ds8CpKH NULL +72M1iL43IC7n NULL +g2WGU1d NULL +d5gs2s6trx20upPuW3SAi4o NULL +2iVjtVVhM8R57oy NULL +VLVJ2YFurner0i58drukgj NULL +a5MyXRAIwPX1CO3w53Rar8wf NULL +c7j0PI24L0M27GoF43v4Ucf NULL +olV01YmQ01kUvC3EE85C0E NULL +dv4kivc NULL +CJIO2 NULL +s038hX0U8 NULL +VfD3Byd4aV358l12 NULL +hANtHaOf NULL +jXpBexSQ3hC342hdkv NULL +N3hv6M7W7kPGp4g5h5D4GGiU NULL +EKsWjbi762Thn44n NULL +pU8A42hN0Oy NULL +m3itBVH5 NULL +702XRI NULL +w7PV8VhGA NULL +hw7e2oF7 NULL +n2L2mKJgQ08uGWsrgC30T NULL +m7i5sn7r0 NULL +15w3qCVPlsGoqbi1 NULL +WT37Vm67A7YcqB NULL +ewpwJSDQ7V8yVPSl1x2E8ey NULL +6kT46TpQ0yPY0 NULL +ueiRBMqV NULL +Jt7E0sR3X7V NULL +VF8w7AjS6 NULL +IQnp6a50KF NULL +U68Np7DCKJO8 NULL +ARhwoFDQ3Q NULL +63JM3G76qq1sB NULL +7txJwfuE1675k322G6 NULL +78Pqc5 NULL +NULL NULL +OxfCar17 NULL +4l6OX60y NULL +4iUAI35X037k6V45lOR5 NULL +W3CqX8FmJInM1Bj733 NULL +IblvAnYcnAwTiEM NULL +23R287wx8g5N22kp034161 NULL +wJ81b1LNRM NULL +0D7WTl75H3U8V4YFTj1A NULL +O1fW6627aJkal NULL +A71P2rA NULL +7YJJ1NwK3COpMARUo NULL +8d4D1 NULL +L0if56g18jb2G4ThBy8FLD NULL +tC57X NULL +04fq7M416mV7CwI1q NULL +T8SE1Ko NULL +qNaAh8CdJxxTG8y0 NULL +32OjMMVB54jv35 NULL +kQ11N NULL +ljrUp5jPP3u6Y5i NULL +FGx13w3IFFT718DDr5 NULL +651rcX4uUheL07lI5m7 NULL +IbgbUvP5 NULL +76Xl5E7ttiejsqcvfJmtNB0 NULL +rphq0n30wctykU8E NULL +Ybpj38RTTYl7CnJXPNx1g4C NULL +ox4gTH52 NULL +2NR62NFR5 NULL +W4BV6M3DalIc8ypF5K3j NULL +jd4MshHSjPOuq1b2T NULL +0lhcglI NULL +118iOoSACcy2X4f2k4Y NULL +xJTkdBR4QU NULL +PYSh3CD1vxxH3Aq2B NULL +1Lh6Uoq3WhNtOqQHu7WN7U NULL +0TN06s2WtHc NULL +Ad4KRAdOpE25j1BV NULL +PNypQte7Gq17k8w77G5cvAn NULL +sohL07P3D1W3aqMu2i NULL +5mGEOMBdF680P2jD NULL +3R4fUi3r5212N4L05I47VU3 NULL +Q5AY2oNpDSOIxy NULL +04Yu8RntCU7amJtj NULL +Yv7NbK3bBtLv2oCp7g622yO NULL +xN4s5It0d7XJ5R6ls NULL +74W3My8nI NULL +EPCRx8ObNv51rOF NULL +jin5N37sI8CpGW3x8X2v2 NULL +P051D3DF78P14Bi3 NULL +8eiti74gc5m01xyMKSjUIx NULL +xgPW6tMwuNv67I0q2227 NULL +T5eOivl6F4ew1 NULL +x1XH6B NULL +QRq4fxOau2jef55O5X1 NULL +y3VheNURDylWr0mse3mv0 NULL +en63YvV2PB76duGPhyLQa NULL +HhttPdKp4 NULL +K8Y8N NULL +4nKp83r82u7BI77SX27g4xDT NULL +Yas32KF NULL +t6Y38CKxB3keFFwxHN1eQh NULL +TlU343q2ha8vt NULL +1o5T8oXJi5CAYe8540C NULL +45pXKo1kmC NULL +u8Vk2ER685 NULL +F10SR3l5836pq7TCfYeGrEl1 NULL +lcL6t NULL +3FXmaPtM8 NULL +cg3hK1u47UJKr82PdlkoOf NULL +AIIfMPtsjP3fDtTNKxGo17Tl NULL +1cVy44 NULL +NULL NULL +H8LCu4M2u4f1S NULL +kU8U48bfwdE61qTrUFe8 NULL +3h8mD2F76eq4mS NULL +u6IQ0Ih8kEh0E6T3P NULL +FUuADXtCD5 NULL +SM7dk420iy847o8hn NULL +8G82H54442m0AjgH3a4h NULL +2YOJT4Sveu NULL +8r4JLW NULL +jSqRIf7HS NULL +ngP1e78xgd7Ow06qY0 NULL +Das7E73 NULL +0863bBy3dkL74WtiERo3L NULL +d3yQbTLvpGyi0 NULL +1Dj48xi11k5 NULL +xBQhmqkimw7Du6qnJk NULL +216N1n3bRv NULL +3hF4a683G4Vc2N1 NULL +5m1276sq8QAT2 NULL +IwT2y4ak76hu1BgGDSKuI NULL +T8qIr36l6EYHj87DVl8h NULL +kih3Q NULL +J25yM2B04A2M NULL +CbULhCEo3m8Q357 NULL +oAYFcgT5 NULL +FBWY8rR466Y NULL +Bb2AdwWmQOcwJhqF NULL +rreK1Bk70JwRIV3sQJEg NULL +OOPorJCyeuR NULL +3FuBrCe3T58bk1Km8 NULL +EqUT4hfjoX45 NULL +s1K04o1 NULL +5a7WjXX5w1bkc8hv8Xx5LM NULL +K2mrUY NULL +RTobm5x6f8eXB77 NULL +5f0u27Q1PvB1gCMn NULL +vvT8tpW518 NULL +To6s02tm NULL +3nCoRI5m217k0BN0W2P7oDGf NULL +w1I8o0u1eg36540H5hMf8 NULL +M462UC NULL +2p0iX031016VDNb6KWJ NULL +8huHS0jX056Ukdx3 NULL +BYt5Ww10GR12r8jQffd25Q NULL +KB3sgv2UcA152 NULL +M5TxI32kgu NULL +nhv8Bo2VCHouwa01x1 NULL +q8M86Fx0r NULL +bQQWG6 NULL +47xesJJ32Ia NULL +UFwddOjC38Fj NULL +EY2fCS NULL +8Fif8LgR5X32HbH4 NULL +ss NULL +TD01cg4gOr1msv1b NULL +80K4C NULL +342c18wA5vW61bEV NULL +4v3613837dytHDDLO NULL +Ajte53RpwICi8C00IAY NULL +aD88uS2N8DmqPlvjOa7F46i7 NULL +b4iTs NULL +407CiWn5Sd0J4mlgB0X8Fu5G NULL +OqM62X0G3j7XpBOTt70 NULL +DS4iDURlsq418pFh8 NULL +plmMo28a0B5CtT63uC NULL +OBbyvnMMUh1iJ80EKnx178 NULL +3vB11S NULL +8VOMo4k2fVr88MuEw72V6N NULL +Xc3mi NULL +2o1aSX46bT5lbybk1K4U NULL +Qmin46 NULL +NULL NULL +1fPLKUK0 NULL +tyt5Bwxxe NULL +R875Td3QD NULL +2H45o NULL +M4O8OkhX3T1D2MMuf2Pm NULL +0f4422CBSl NULL +a2037 NULL +Dk6tb8PWF643qyp258O2 NULL +00MmJs1fiJp37y60mj4Ej8 NULL +hyi44EO7Eqi4QI1qQ7h NULL +M0J1l7pujAvtkGH NULL +nGTXlmW5SAe NULL +NMpVM487tCGA5p31R4g8 NULL +4Y6F2QEy0v68 NULL +8nrs8SX553uTd63hTJ NULL +vgd8P8Ff1n NULL +h033pR0WjHA8gaBF5 NULL +nkn5JmM4Fw58 NULL +PADsH06 NULL +K5OgpFUUHCnm3oif6f NULL +7h2kGPt4 NULL +Hf8123hK0 NULL +K4Npj34S8iAOa6qRd7y88Sb NULL +361M8OmUcKBPrFTcY5 NULL +LVx3B1X8B NULL +F13clAHtHaUN2t6wLxE7S3T NULL +j83cOtj22H5Aje7H3 NULL +aw724t8c5558x2xneC624 NULL +VDTWq NULL +mYAtk4w3 NULL +sodtQ7I41ON4 NULL +DM3fMIDl770Nt083jjTQ2Uh NULL +mbHrOP6Hk6j5g3U41ml846d NULL +nP0Hc12W5ImgF4f8sbS0n6K NULL +0EU2GSKN4svnsv NULL +IWNnWp4jmtO78 NULL +U7JukXmI NULL +WA6Cb1YeX7TOI7j3jnrh7W NULL +OJtk6 NULL +4lKBN0OF1pkx47YV46 NULL +C6hoSE4L6NCrA NULL +62Q7DRed301Gx NULL +LgMBG6G3Oc5baLkjeP50i8 NULL +1hy4qfv NULL +m1cWNMV8fcdiJAmDPPLg3y NULL +56EtJ6FmSp47bf0Jj NULL +BI77180Jc0ga4eu2TD3n NULL +CI31dv2fj53Ncc NULL +6502UQ2Jb18nD7kNw NULL +435oSIASgSON6 NULL +6GpbwQ3mT NULL +S5RB5whaBLeLnMBAUm4oXX NULL +Ako362FErCK8F2v31h3Ns260 NULL +GR340IBvbTi10 NULL +jnd73503RfJPdliu05654ToE NULL +xg8H7AdJP8bgp6VF36U NULL +22UwE NULL +P8pPp60OlbF7 NULL +H8dq1J4bt18aF4W48 NULL +QgA6r86x0JrfdHuM NULL +4h3m5Dy0nQ NULL +d1N0u454kG87DN3o NULL +05oYA4ya5 NULL +78J23v NULL +Ydq2dX NULL +wvd3uAAa01J6a6L NULL +aCU4m258 NULL +sU7rit NULL +J0VTT0R8t1JcxdoOO NULL +hqHBv4edb2b6Hy4Q5u3 NULL +4c41c6 NULL +NULL NULL +YtN1m7B -3416.0 +r323qatD6 -11447.0 +4ywIOdqIu2gvc -2165.0 +QAgnk2L5bnLH580a143KUc 12738.0 +JRN4nLo30dv0bRtsrJa -4319.0 +mP1oe11JWdgLpvj7 -13474.0 +ij735 -2626.0 +rXPSoTyG 10895.0 +Kv017 4376.0 +8pbggxc -3914.0 +ntl460JpLvO6wbKAy -4250.0 +8E2EQRxxnb6ejKo5 -2433.0 +NEK1MY7NTS36Ov4FI7xQx -10682.0 +0xsFvigkQf7CEPVyXX78vG7D 4014.0 +B0q1K7dlcKAC46176yc83 -12313.0 +L4WQG81b36T 1970.0 +p17JVeQ653n6bqAd1U -5000.0 +cL4J4B 15260.0 +Sd8C6q6L7l72qsa 5306.0 +0I62LB -5466.0 +oX8e2n7518CMTFQP -4050.0 +OKlMC73w40s4852R75 12464.0 +N8hEI6kjLn8m 10191.0 +D3aT0bC8 -7098.0 +48Dj7hY48w7 5146.0 +8GIqX3tvNqrgH -9439.0 +eXJSaD2y6i8Cr2wwmc 6722.0 +CV8faVl08s0 -313.0 +703Y1U84Wa28ryl -11480.0 +3m1iT73ta75bK6Uek0R15bk 8381.0 +0eODhoL30gUMY 2590.0 +4Ko41XvrHww1YXrctT 367.0 +kkbBss8Ie65SWe 4869.0 +4kyK2032wUS2iyU28i 8061.0 +7afdC4616LFIHN -2179.0 +d77tW1Y01AT7U -15267.0 +AyXm00Txvx0L5CyvWXQtsyAG 10536.0 +b17euUA 950.0 +8M8BPR10t2W0ypOh8 -11817.0 +m43C0pl87nWOGj8 -2451.0 +0AP3HERf5Ra 5045.0 +E50oY 11799.0 +425s7e8Q4LHYWbQ35I0 13098.0 +7258G5fYVY 13206.0 +FpsIohh60Bho67Fb7f -5732.0 +74shmoR1 -13746.0 +NtCOg6Jx6B -14978.0 +a 12004.0 +m2Y8B81106O 15489.0 +324X0 1385.0 +8bq4WFH5B3s74f8yk5iRT3 13331.0 +nw184wBFN -4164.0 +CvyRV3W8I3I21kS5 3004.0 +8S7pAI056 -612.0 +5V14R7pp4m2XvyB3dDDqgxQ0 -6256.0 +764u1WA24hRh3rs -2120.0 +oTh026tl2Ena -11198.0 +b565l4rv1444T25Gv0 9517.0 +01L3ajd5YosmyM330V3s 3756.0 +kcA1Sw5 6182.0 +Po4rrk 3442.0 +T7eUGy8NktrfLCyXKIK -6328.0 +6gn67gaXBQowu43N0M 7828.0 +AD6Wgeg -10859.0 +El12E1cY5NV5icR6r0 423.0 +Xvyjl2vcUcxY4 -14086.0 +f8e16sE7qHnJFq8IjXe6uSE -9408.0 +2ArdYqML3654nUjGJk3 -16379.0 +B1NGi -7666.0 +TdnHPQ5q1mp -14173.0 +M6bPuQa0qryvlavpXdYX7 517.0 +x8n40D35c65l -4002.0 +qm65581I1xpqC2E706qtT5G4 NULL +LSt435WAB5OKB -7333.0 +PxgAPl26H6hsU47TPD -12794.0 +02e5aKv 7585.0 +0RvxJiyole51yN5 -1211.0 +QEF7UG67MDaTK504bNrF 15217.0 +2b7P4DSK3 -7768.0 +ODcBlv740YOO2D 10923.0 +MTf2Cww6bhry38k0mB 14126.0 +3kFb68 -11779.0 +7sA426CHy4 3822.0 +TP3nXW588VD6P 11413.0 +16twtB4w2UMSEu3q1L07AMj 2940.0 +3bKNkOve3 10080.0 +W772E0x 7864.0 +j1ILd3p6Ry5jVC16 -8608.0 +l74x86GvdbDjbKlTDSet 184.0 +umNykRkKiih6Cx6K42 -10134.0 +223qftA0b 15017.0 +Ew6cjg680S1IsOa4ueVQmLBT -11146.0 +6Tnr41Pj3OS 7058.0 +c0A7Ma63T77BgT71 10767.0 +rR4SvF6ME4BtJOx0Q -7555.0 +oto48Un5u7cW72UI0N8O6e -12252.0 +6D4H88YldHdj0 -11273.0 +8308ogefQEebr48 -11776.0 +Dy70nFW20WY -4606.0 +5h6A0ennI 9677.0 +RBtE7gkmLOh22A4 9614.0 +7OBJ788LeOqT3GGdn5QOmP -10715.0 +x0w77gi6iqtTQ1 1850.0 +hxH7487S3TS -2286.0 +ue8IUf0GlY18RT325P2tu 13750.0 +AS86Ghu6q7 10681.0 +wLIR3B37 8499.0 +e6SAAy5o0so6LM30k -548.0 +2WTglrLC8A01S3N36yRm45 4551.0 +10vke853 -7707.0 +f163cH4DfXvJ1nw36Sq6Pu -7773.0 +aH38aH4ob 12197.0 +00LnqxnThlCib -12444.0 +TT4CHN -6060.0 +jjc503pMQskjqb8T3tCL0 -12883.0 +bMyM0QL -9158.0 +XP2cjyx -9367.0 +gHsu7HyRW25P4w3518PIv5 -8172.0 +LT5xeh55eL8WC3PaW -15144.0 +sUDIi6Mod5 -2997.0 +0SPVSOVDI73t 1016.0 +7Spfb6Q8pJBNWi3T 6897.0 +liesHDBdq2Y18k4frvp3u 2531.0 +Io7Mj0g8fwd7L8b4Di 1575.0 +imH3YwNd33DOtJ 2546.0 +qo2Go5OQTco35F2 4819.0 +77WBDf3sbTiSpv8SS4cp -14820.0 +45HoP7 -1234.0 +5BFMY8Bb582h6 4122.0 +2Q1RY 7887.0 +l4iq01SNoFl7kABN 15311.0 +37EE5NIy -12996.0 +0Grrbs3Mu0 7209.0 +20QwDjvR1 -14955.0 +60M56qKrd2j -15205.0 +26Mx1k447Tk5 -3888.0 +5keIL 8903.0 +U7r33N1GT 2570.0 +KwqjKvxg17Ro85YEQYKl -4971.0 +NxtVjEh 3139.0 +PovkPN 5312.0 +8tL4e4XE8jF2YLJ8l 15061.0 +5Q1O33oqrTMit1GsEy7h 2052.0 +1wMPbWHES0gcJ4C7438 -10276.0 +B8KDHDSu5H -3054.0 +D6UtO8l3 NULL +1vAA65LuIcGceY632 15507.0 +k1VX0eFh56x3ErERaS2y55B 14909.0 +5p6D71O3t2j4Rjkiv7UG 4837.0 +far4S170PC 13691.0 +1470P 328.0 +8M42dX6x214GLI 7956.0 +jLX0SrR6OP -12264.0 +gL4Yd4kwC7853nBBfiWTmk 16327.0 +uxI8i 8120.0 +iG1K1q1 -8530.0 +u6ELlhG3 -15070.0 +5EOwuCtm184 6597.0 +tFtQ26aDMi1tJ026luPcu -3178.0 +0mrq5CsKD4aq5mt26hUAYN54 1329.0 +BWiKbU8s3 10147.0 +8Qr143GYBM 12819.0 +8r2TI3Svqra1Jc253gAYR3 15879.0 +lKk18ML -15057.0 +D3rrf4BKs5TE 10659.0 +3yJpSNg1f2m3J486g4TF1uT -12847.0 +S74dET7kWU7 15580.0 +5OcrJ -852.0 +P3ejfC 8897.0 +63L57061J754YaaV -15253.0 +35AUaVfS3BhcFg 10308.0 +7bj4Yo7E5XDT 12870.0 +5hwHlC8uO8 -294.0 +7v1FU 13268.0 +oQfKi00F0jk78PtIB8PF -1114.0 +q08W111Wn600c -1676.0 +3q4Mex4ok5Wj6j706Vh -10286.0 +87y8G77XofAGWgM115XGM -16026.0 +m2482tQ 4049.0 +E7T18u2ir5LfC5yywht 5005.0 +5M62EjXtos2G 13298.0 +OOv831H5DA41gTrj 1289.0 +4f8ynytRB62xY5AoVfELTku 1012.0 +kushHKMOdU4 -4585.0 +2mwT8k -10653.0 +dIw0j 9774.0 +vvictFVSOgi 6612.0 +rLK4TwmblUXav 10208.0 +P35JtWWC5M42H7cTpwJN -12207.0 +h2c0frokSYjfs 75.0 +QN3Ru4uhSNA62bgc4HI35 -12165.0 +4teNUJ1 -13436.0 +05jXQ1CW68sF7G 4442.0 +q2y64hy2qi458p2i6hP3 -7982.0 +ii6d0V0 12732.0 +y7S47c5V -11734.0 +aD78M5u4m0FfR78 -5836.0 +8gkio4o1 -6989.0 +3S3Q2JL16PXfq27bdjC3T -5530.0 +RvXrVMQEEE 2536.0 +x5vy367f6d81FfL8AI8XJ 11683.0 +6P5hI87IBw5BwP4T36lkB2 -1388.0 +7bO18f2QAcD2 3385.0 +4srDycbXO8 4969.0 +CHP5367P06dFMPWw23eQ -15760.0 +SVI1m5jI 10862.0 +LCUh4H7E8RT8opWRW8m -4593.0 +04H5odDUy1D1rhGLXGu 8068.0 +00ekFtl -6142.0 +51pI6Y6pcEoC4 5607.0 +Cxv2002dg27NL7053ily2CE 9882.0 +YKgjnm8n7x70AI0m7M -9499.0 +S12r0UF 7322.0 +7Y00tGm 2234.0 +RW6K24 -9580.0 +cv6sd53W530KHEOy7 -8103.0 +ioGNy2Sr5Y4vnJS7w34l2a5u 15797.0 +b2Mvom63qTp4o -14355.0 +c8V83575 NULL +y2Q3YW 11813.0 +7dqm3Oc6um 5543.0 +78sBmK71Yt0F5q3 -10.0 +dqSh2nXp 15296.0 +rg2l5YHK3h414DWIC1I 2366.0 +uv5m1sFX10 -8148.0 +43wxS75R7cg -6817.0 +QAHN2k5a5UY046x7ae 15734.0 +uNJPm -10737.0 +gMc3d13G6rM5 10398.0 +Nd6hm74FA4k65m2A 2326.0 +a0YMQr03O 10671.0 +10M3eGUsKVonbl70DyoCk25 5658.0 +NL26D4S5nlPfyP322Jdf -4586.0 +6XR3D100e -13345.0 +QW7bld1X2L -6192.0 +31A6tiD0K20miSf85 -13555.0 +bVvdKDfUwoKNMosc2esLYVe -10016.0 +cwEvSRx2cuarX7I21UGe -1434.0 +5of6ay -9761.0 +g0C6gENIKCKayurchl7pjs2 12201.0 +6317KIB8strmpE85j 3242.0 +5xx1I7x0xtC4LJ 1632.0 +1gsKPxa3Fr6sT -15017.0 +4BxeN7PLh00qDKq13Nu8eVQ 2336.0 +5bE05Udr7Xm -12426.0 +61gE6oOT4E0G83 -3714.0 +dQsIgL 2624.0 +jcS1NU2R06MX2 14177.0 +A2OkkG6xRsW2VXqggE 14247.0 +e2B6K7FJH77Y4i7h6B43U 12452.0 +eaju2o4x863Hs4pskfDBRYnp -11493.0 +2STdm3wq2BF3JJ6DdRWbl 4328.0 +eHxtaCo643hV3BIi2Le35Eq 9814.0 +nDWJgTuQm0rma4O3k -8567.0 +5rvGhuUle -13956.0 +8O6hJAm5RYLGl1 -3833.0 +GI8y0O4mKt7nev21K4KOt1 13405.0 +J2El2C63y31dNp4rx -4190.0 +gMxuFTWhkh5RQ1VJ -13302.0 +mCoC5T -12826.0 +3l7KiBCbB0 -11403.0 +5Jwa8e3 -15423.0 +bvoO6VwRmH6181mdOm87Do 10144.0 +whw6kHIbH 5142.0 +OIj6IQ7c4U 8233.0 +wEe2THv60F6 -5589.0 +8fjJStK8D7bsF7P3d65118S 11040.0 +sOUSJT2phw4 -15864.0 +tINcSR1MT3f2P4 -9147.0 +O1Rlpc2lK3YRjAQu34gE2UK5 -6216.0 +qngJ5VN31QNp3E6GBwnHW 7120.0 +XI2ak7U1yv05DAI71 -9397.0 +eWq33N3Xk6 -11596.0 +488l506x 8868.0 +KBV5WE6y76le 10683.0 +eeLpfP6O -828.0 +74iV6r7bnrdp03E4uW -6917.0 +qP881I3Y3hjJ -7556.0 +01I27lE0Ec60Vhk6H72 4272.0 +b 13839.0 +T43TP 12013.0 +CmsLN67Kn06aGHb0nWJrh0o 13270.0 +AGYktyr3k0GMQx7bWp -12990.0 +SaLkDRK8Eo45NsVo 2984.0 +1Hw16y3hmpG1O6hXfd6 -10894.0 +GP1Kc84XR7Vk10384m7S2J -9375.0 +03x70MmrDft3GtJF7y82QL8 -6665.0 +SDw8F62m1k4E8tR1YSIfT8 -14534.0 +R04RF7qkQ8Gn1PPd33pU6 6637.0 +F88n72F -15666.0 +8JUh1T63oLSOUc5UpCUFO0K NULL +DKMC7jIoLI5 8609.0 +iDlPQmQC7RSxNA -16004.0 +780mFMK0kakDt0nB -7572.0 +6238rs225bo0RaTw5 6262.0 +EI6S4ARfxC3gTET8r -2688.0 +Fq87rJI5RvYG3 -15729.0 +FpcR5Ph -10241.0 +3sLC0Y2417i4n6Q5xcMF7 -6106.0 +VrRTMth0WY7T 2464.0 +Re88fHL7 15332.0 +veoqj217BlDBBVkN0ei3c 10039.0 +HyL5Mriw867oUioTmr2SLfO0 13619.0 +0W67K0mT27r22f817281Ocq -5818.0 +iVt3aUt4Cy322x2w18lw4ku 10421.0 +YnT6eMr3y77hRu 384.0 +3dRX8I6b1UMfx 2913.0 +K56DBI 300.0 +n8VCp0 8488.0 +6D8pQ38Wn -16140.0 +88G108W -11774.0 +Q443wtttcf01y 5951.0 +4fB0amev -10288.0 +3gh6J5 6780.0 +H42eLKO 11010.0 +psq21gC3CWnry764K8 -14073.0 +6KRNb14xEP 10859.0 +5gOeUOB 2506.0 +e4B88ElS8GH6sSaR3i -11623.0 +e4rLBwDgWm1S4fl264fmpC 9962.0 +7716wo8bn1 -6978.0 +WWo570W28lhx415 6392.0 +xh0Qhj80MAcHEMVKx -11115.0 +NLeWW8OXjm1680DM5MU 13963.0 +BI34Ap4r3c210R1UBF6Lp 12440.0 +FJfamcF044ljD0 10252.0 +seBu6qmL15E2WFJC37raLXVL -12964.0 +uq2hp -1007.0 +w6OUE6V3UjfE2 14276.0 +r4fjAjel4jHu27vYa1Vox3 -12443.0 +a0mdHI0HtSL0o8 8163.0 +IL6Ct0hm2 -12970.0 +2y7hKN32yv3 7354.0 +4HvM3Jab3pv6V 8717.0 +H8P4VX62803V 8752.0 +7JDt8xM8G778vdBUA1 -16092.0 +sgjuCr0dXdOun8FFjw7Flxf -2778.0 +l7OeCG6Wug1Rl42lSpR -15920.0 +Ho2IJ5Vpi16A -9994.0 +Usb4N -9174.0 +sl0k3J45 -12657.0 +60Ydc418lOl284ss63 3316.0 +116MTW7f3P3 -13443.0 +7gGmkmKO80vxDN4 -3322.0 +wfT8d53abPxBj0L -12052.0 +yxN0212hM17E8J8bJj8D7b -6751.0 +4tFQX5 9390.0 +F5n0SfL8CT53dFr51vvW0S3 4432.0 +8lAl0YbpyMmPgI -14696.0 +k7RL0DH3Dj4218Jd 14863.0 +JUrP4 -8130.0 +081M8a6yJtxj6w51C4d -177.0 +C1KV2I0wL8wk7C6371 2776.0 +7xY3raCHiT3hA 11525.0 +5lO3R6cjxRdsCi -11252.0 +luO237xh506F18pw5TWqB5l0 -8659.0 +l20qY 8919.0 +U8qkvKqHFm85 -1198.0 +8n431HuJF6X2x46Rt -5513.0 +Q1Y703ieFHD16F7 -8872.0 +J15C2 -2476.0 +74VDRA6 2156.0 +8jya8308Md7 -13723.0 +04vwGN4a82bd6y NULL +mpceO34ASOLehV0 3318.0 +P35q3 -14317.0 +lju74Mb5W1P 13573.0 +Y4JQvk 10557.0 +Qa8XbKYNym5Se 2442.0 +VH1O2Pd0B4mK1b62djD 8139.0 +lwyLcgYL0V0D5 14735.0 +0wyLcN8FuKeK -11456.0 +P3484jw0Gpff2VgoSdALY 7872.0 +3F5nYf7D2P4YGlpTQb7Qm0J -7343.0 +cL6DXVE0d8hnE6 -2082.0 +XI5Jwr7nd 4704.0 +0njk0OC3d8486u -3627.0 +G54It40daSr8MF -10301.0 +rELQhxExg7NKKs8hS5c -4843.0 +3M5o368CP0fJpOiskA6pYeVu 1154.0 +jSUVVR -7375.0 +PQ71uI1bCFcvHK7 -13872.0 +t5805L0xlU0YM -13339.0 +N6G5QssB8L7DoJW6BSSGFUFI -5296.0 +vwb48kytjp0Q2YEb 12581.0 +2wak50xB5nHswbX 10653.0 +316qk10jD0dkAh78 4257.0 +2c4e2 -11760.0 +I3F7N7s7M 16011.0 +RBvPK67 8146.0 +ODLrXI8882q8LS8 10782.0 +5Xab46Lyo 7598.0 +61Oa7M7Pl17d7auyXra6 -4234.0 +Kc1lPGJx6JXTcDsck00 2803.0 +wiBqE2A1x8T8gcT4 -15101.0 +4jY48jNU58G17PN75 -14280.0 +U4MrN4CKBl84 15895.0 +58xyX 6346.0 +al8C016TUxSmoj4 -8302.0 +JwtDd8psW2VA -41.0 +vvK378scVFuBh8Q3HXUJsP -9554.0 +qw430g35j -8761.0 +o12yq 7358.0 +sN22l7QnPq3 -1419.0 +YkfDreGs8Xi -4633.0 +840ng7eC1Ap8bgNEgSAVnwas 5625.0 +MfC1iJXG0UIde2k4Rt 14923.0 +1aI03p 9766.0 +8r5uX85x2Pn7g3gJ0 -3005.0 +55laBDd2J6deffIvr0EknAc 14095.0 +2elvVv5Ru3a3OXP1k 4384.0 +5eY1KB3 5204.0 +ATiN8ic3g0Jv0lJL0 -8564.0 +P3T4PNGG1QqCpM -7577.0 +5Qs1U0b3B0c7Le72Q3537o -4713.0 +1MJ884f1w6B38WBeya -2575.0 +Lj7E348IVT40r6IaNt6V2V -8512.0 +cC7QeLfb 14459.0 +t78m7 14512.0 +Rue8aABtan 8862.0 +x1832l1R2m3V -5070.0 +Ae8v6oxYn77701gt -12847.0 +1K0M0lJ25 4141.0 +iQ51KkUwoE6YRVW4 8005.0 +P11Rvk -4800.0 +8IcQ0DU 13107.0 +PNs6tw6fjOl1yNl1e -11377.0 +8eBnNbUAGV6AAAshW 6913.0 +lm60Wii25 9304.0 +rIQ6FgkS3Sjn8H8n8 -3589.0 +2LTgnBrqS3DAE446015Nc -2942.0 +28MAXOSiX -10476.0 +meeTTbLafs2P5R326YX -2415.0 +7v3bUgTi6IBDVdvyb6sU 14124.0 +4H8qjd2yd36j5W 13117.0 +tUi8QYP4S53YPcw -7959.0 +l240RaDaGI NULL +0MPx71oMa 6644.0 +6nhFMfJ6 109.0 +iP2ABL -8162.0 +pykOgEnNiP516Qp48w5 10039.0 +tmS75um6Mvyb6N1oiKP7 -11073.0 +qNE6PL88c2r64x3FvK 10538.0 +MFaMcxlV -9039.0 +b5JRqQxwXbTOtfi 1594.0 +pw17fB7jOUV3lC356uITaL 5057.0 +n1OMwaWctgOmf5K 4269.0 +6gYlws -11061.0 +DUxeD78eL1Ci82O7 -4457.0 +He570RJQUrj7VmG 2322.0 +R6xXNwfbk -2129.0 +lEXXcvYRGqGd31V5R7paYE5 1225.0 +1SkJLW1H -12515.0 +yfR36R70W0G1KV4dmi1 -15590.0 +E700DGqQTWX5s 2396.0 +6U78kBJIpi8IK 13080.0 +3E1qqlB24B 14152.0 +cL5mDs1nJgQ0IbgBH 13246.0 +5yFe2HK 3396.0 +QJxfy45 12427.0 +oTEu1ql 4111.0 +t7Sx50XeM 7557.0 +0ag0Cv -5942.0 +ygkC2e2sUm2036Sd1U8kCG62 -8871.0 +83bn3y1 -4638.0 +Fdsa3uDj6 11526.0 +d23u5801Hv6md41F -11343.0 +p1g3lpo0EnMqYgjO -10773.0 +T2o8XRFAL0HC4ikDQnfoCymw 1535.0 +Q2TIySPl735 -7161.0 +1B2Gb0 -10525.0 +v3A1iI77YBRwl3I16 7391.0 +ELY30563as 7057.0 +iUR3Q -947.0 +067wD7F8YQ8h32jPa -16012.0 +ph6mBxl3JrPyUM18D5V -6239.0 +gLGK7D0V 11865.0 +dGF1yf 3426.0 +TFRri2x57auqTyFCG -7604.0 +6bRSgHOELMA 583.0 +G8N7338fFG -1298.0 +V284s5H2BBaoJAb3 6864.0 +24t42K005K7v84Nx820euxD 9362.0 +kPpivtTi0S43BIo 6581.0 +tdUWi -877.0 +pC6BM285 -2583.0 +KA2M874c7v83T -7352.0 +563414Ge0cqfJ8v5SaIQ2W3j -7170.0 +w3OO7InLN4ic3M0h8xpvuBMn 3255.0 +IaaNQ61LShbK54SI -12109.0 +MUg2eGVMxLEn2JlY3stOYR -741.0 +54yQ6 7148.0 +dV86D7yr0I62C -13617.0 +1KXD04k80RltvQY 1891.0 +Jh7KP0 13878.0 +35nkObNsO2p045cJ3 270.0 +Ocv25R6uD751tb7f2 -3657.0 +iO4Vsa4mC3r05C 2137.0 +6C5aLN4wM0 -11432.0 +587FWG5e1NylA0SQD -7788.0 +BPm3v8Y4 3151.0 +4lN2ugyM0MGtsv4Ak1 9916.0 +y1uSBY0 -16032.0 +D4tl3Bm 7231.0 +aBL26v67ENBr3T47crW -27.0 +QjlVHKWJ5oU -52.0 +27M4Etiyf304s0aob -5909.0 +Lhd3twEA66xDq 1366.0 +x367l12Uksc1HybMt8JxI NULL +7smvc50Lf0Vc75l0Aw1 15538.0 +5xaNVvLa 2315.0 +b 10938.0 +P5iS0 -4168.0 +OYC73wSr 8541.0 +67LS2DjuCX36e6t1m -9137.0 +60041SoajDs4F2C 12826.0 +10lL0XD6WP2x64f70N0fHmC1 4516.0 +H4LBA6246B2N3OkOpx 566.0 +fyy678nyJ 1912.0 +j8fJ4l2w4F8fI51 -7691.0 +L5X4732Ib1Vj5ev 8542.0 +2cumAMuRN4kC5dJd888m 1603.0 +iUAMMN23Vq5jREr832nxXn 4149.0 +7u351EK474IcTOFW -13653.0 +kwgr1l8iVOT -6410.0 +Q82FD1RrW 5860.0 +8Mw4p5Jvd 10437.0 +NOCE8N1D5yL2NU6 -12888.0 +2Bn5g5acI28H -2994.0 +03R4fW3q25Kl -11690.0 +qtLg48NdHXho3AU0Hdy -11744.0 +1m6h0T -5407.0 +wblxBWSlwWlX7E 4502.0 +aDNmF88FfTwOx7u -8251.0 +87oee8IK 2372.0 +NmsV7i1Ao32P 4093.0 +VWIJM32 -12225.0 +TBbxkMGlYD17B7d76b7x3 13786.0 +R1VmJ10Ie 14947.0 +3h01b8LfJ812JV4gwhfT8u 6798.0 +L6i8QtMXLeaW6 -16218.0 +K54bM1PBEyv85M7J6G 5277.0 +1U0Y0li08r50 -15261.0 +1t4KWqqqSILisWU5S4md8837 -7101.0 +C2HD3c8PSr8q -9328.0 +xnk564ke0a7kay3aE6IC -12066.0 +E07SN5VEyl -1546.0 +wc4Ae163B5VxG2L 301.0 +3B3ubgg3B6a 14468.0 +sr3RqpPq1yDg4uSXQKm5yS -566.0 +M7J5a5vG8s3 1338.0 +Tw06W0Qga0 3100.0 +4t88O3hdap24Qp4182u1 -11906.0 +615Mv -10426.0 +148JFHQ0ua53LXaI 1113.0 +b8KY04 15236.0 +4YNyI4NW644vp0gN3 2786.0 +6J2wyLGv 6441.0 +y4jD1v2Go -4683.0 +FVq4l0ohQ6VBFe 8264.0 +4Kug5S2q -3689.0 +v4gQqo0bxX256o7EEN42lSoU 11021.0 +Kn22pycavya023VJqu -2985.0 +f6B6I2d7180wveu1BG63b 4178.0 +5cC5thW3jHmOE06MRNc 5902.0 +7MHXQ0V71I -5564.0 +ILCAW28PE 5674.0 +KlP8GX12PxC4giG475 -8630.0 +sUPw866pq -7554.0 +L28vl 2438.0 +26x031 -5772.0 +AKSumJy2fP 14054.0 +nISsBSmkQ1X1ig1XF88q7u7 -10913.0 +685RhQF6ctilEV3S2h -10986.0 +RDLOWd758CODQgBBA8hd172 423.0 +F4e1XPV2Hwg7a3d3x530818 14688.0 +1uerCssknyIB4 9620.0 +t7s5did -2120.0 +aJBC20kS7q51m 6769.0 +1AV8SL56Iv0rm3vw 9142.0 +0kywHd7EpIq611b5F8dkKd 14509.0 +0jP5vF5FAwp NULL +aTuJRwHes2vW1Rl 9767.0 +1r3uaJGN7oo7If84Yc 1322.0 +RAUe5p 2686.0 +FG0nEK47BRaoVQ5B2HMA6K -14843.0 +k27PYR768LV7k6Qwh -12018.0 +r8AH7UhYMb4w6nN30C -8351.0 +nl88MG1Uf7dNgIXK5nc6 -1937.0 +B1lkUgPnf7ddbeKxPOGtP4n 353.0 +pWLrP6YtsAiWN86P8hdK -10791.0 +C043G -13678.0 +muoxr40V7kVomUrDAQ 14412.0 +vXc7m82uAg2g24 -16001.0 +mA80hnUou50JMq0h65sf 15088.0 +t7i26BC11U1YTY8I0p 1017.0 +417u8MVN77syjg88qN2 -14892.0 +vgKx505VdPsHO 13661.0 +JbOAgILdJQ 10268.0 +Is4ogkJ64Sqcqf -13815.0 +INxp2d10SKEd75iE4A7Yq2vc 5492.0 +4O41kg -15027.0 +puBJkwCpLJ7W3O144W -14585.0 +NOLF8Cv0gchW6gNPX4 -14014.0 +GPntPwnx0 -14438.0 +UyyIU1l7M 4332.0 +cM0xm3h8463l57s 1253.0 +utfrK57P2tp0 -12525.0 +qQghEMy7aBuu6e7Uaho 142.0 +uGD31tQ70Py2E0T 16084.0 +t66fkUkSNP78t2856Lcn 15678.0 +vA0bEQqO50LlKcj7AAR56P63 7111.0 +7t7tL288aFIHcovPB8 8982.0 +r121C 11387.0 +43d0nGQNH8m6wcT7p0T5Buu -14035.0 +QOt28D6Ov -8010.0 +3U6OMM3 1681.0 +Uj28ubp026RCw -5469.0 +M6g5TG0BW1bbK8 -8758.0 +Iy2ED 10728.0 +3xa2cIfnRg3LQpKRUkUF -1214.0 +2By078 -15454.0 +WU7g0T0a15w2v5t -9418.0 +f1b7368iTH 11837.0 +03jQEYjRQjm7 -6739.0 +84TvhtF 352.0 +2uLyD28144vklju213J1mr -5470.0 +vH8AHgcWaDm 13309.0 +8hMHl64qhfWSdC -8814.0 +Pi82o7b1r22Q0miJ2HPet 498.0 +lV6ksJLpk8VyfuC 114.0 +1P0HN1edMF8 -2932.0 +LOeiVy1yE -11326.0 +s7We5FvPwxD0 -8557.0 +25MqX -4221.0 +nkWSmqJMt661 9789.0 +rHjs2clm4Q16E40M0I1 9371.0 +wLWrtVNx188P7uXPV -1428.0 +tca24E6L -12721.0 +3d631tcs1g 10796.0 +QWfu6dR4Na2g5 -9974.0 +jc3G2mefLm8mpl8tua3b3 236.0 +4R0Dk 3617.0 +pcIsqO27ETcF028iVyJY81 -13597.0 +3yaploii6645LP604gTB0 -4483.0 +OOxiRM5Eqgu81j4o3v6 -2395.0 +X6155iP 4774.0 +8W3527304W1WeGNo0q12l 8804.0 +7XhwAvjDFx87 -7033.0 +BfDk1WlFIoug 4220.0 +6D47xA0FaDfy4h 3100.0 +2VC0DK60DgLH 10435.0 +HcPXG7EhIs11eU4iYK5G 11908.0 +3pFU58Ow1lnt7vRnbB 6894.0 +N016jPED08o NULL +K26B60qNA761SuYdXKhu 15278.0 +4stOSK0N7i8 -15871.0 +EbLh7DAd -682.0 +bnQ8QsKBD7L0213Wx7cB16n6 11031.0 +HmBi32XWTjC3dd7stD0GY -212.0 +a4PMyxYPeTA0Js14lFCV3f -3746.0 +P8NPOlehc210j8c781 12949.0 +D7d5u8c2q2td7F8wwQSn2Tab -2785.0 +r2dK8Ou1AUuN8 6831.0 +410L723g40Le351u -11597.0 +SI0aUsOw28FfHfuCHj5pd 6408.0 +PlOxor04p5cvVl 5064.0 +0N4fmSaB0op1780h 15167.0 +ToOQ4YhGHo 14146.0 +5a1WX31BgmldK0J4F6DAICMi 11823.0 +r01Hdc6b2CRo -5194.0 +wP0re2S74Y308jgOTc6 -10311.0 +1rK23 -972.0 +Aiw4841qJ03Y3Prap73V0hub 11399.0 +h7p2nWBK37qeYg8351jf0 1567.0 +g6euntqquMH 5545.0 +nfsbu2MuPOO5t 1042.0 +21l7ppi3Q73w7DMg75H1e -447.0 +weQ0d24K116Y0 11147.0 +61fdP5u 4143.0 +6a2D5K5rTI2Q2HaK3v1VO5F -5012.0 +pCP7Qwk2d1i5vBo 571.0 +FBpLbIy1k2Rw44G1j0 -9574.0 +G3yY14P0epy8DUS5KR 10152.0 +BQ60TJs02sdrNnE8d8 -13405.0 +J34ijU3243 -7672.0 +v4L3dR650oy4O8MPhjc 8757.0 +Cq7458Q8iJtn4aq8I3E -6900.0 +3445NVr7c7wfE3Px -15768.0 +RxIBul6t78rw01d 15727.0 +5Wn74X54OPT5nIbTVM -8790.0 +Wq28q24Of -1608.0 +22s17wD60356NWi2m30gkHbm 10267.0 +YeBR35 -10594.0 +d2A5U2557V347stTcy5bb -13334.0 +1a47CF0K67apXs -7715.0 +5M5i18Ol0T6u 14375.0 +1r83U1NHOu8n42Kn8gTpb 14061.0 +G4o54J523mDEWchsL -5987.0 +d4YeS73lyC6l -16168.0 +lOyq082EPF1mv7Aldf 7187.0 +O6o7xl47446MR 7031.0 +oa2Tuhc5i72WE417y1 14675.0 +n8e0f67S08SY8QnW -4226.0 +3MNavGRlSAvHwbH55xrvY4I0 5611.0 +01wk5BRpjoirtQ0KKd2m5X 668.0 +veIw1kh7 9239.0 +E82GlbIr2v62H5d248gn662 15492.0 +IFW3AU8X61t86CljEALEgrr 11329.0 +vtad71tYi1fs1e0tcJg0 2960.0 +f12qhlvH -3544.0 +K8vvk4yC81N7ToL2XVb3d -10146.0 +axu5k1BMtA6Ki0 -1227.0 +D8uSK63TOFY064bwF -13470.0 +720r2q1xoXc3Kcf3 -8554.0 +qA1258Ou43wEVGt34 9459.0 +ugq0uAy0qXj2D0fX 5245.0 +3a7WcjS0uc0bqUmPmu -1885.0 +6s6m3UL4WP00J7qOQ52h7 -11118.0 +Uhps6mMh3IfHB3j7yH62K -3799.0 +1Sq6q2cfuq8 -10606.0 +4D64Q522LOJY7lu4 -6407.0 +50nbm6coT162C0gSHAy3DB 9314.0 +UR83Iqx405t0jOOhF 12605.0 +8b1rapGl7vy44odt4jFI 13561.0 +Se4jyihvl80uOdFD 15076.0 +g5ImOPrB4l0a4cXWq0 NULL +ihlorJE62ik1WuKfS -8390.0 +55b1rXQ20u321On2QrDo51K8 -5132.0 +2bD1h 3467.0 +AGI4mak -11158.0 +CAgHwQHau58X -10198.0 +M0kjTU3N2L5P 368.0 +6Xh62epM8Akab -7786.0 +7PE3Nv5LTl 6206.0 +Oy556808N3x61lc5Y015 4045.0 +mxRQ8T 7639.0 +3AsYyeNCcv0R7fmt3K1uL 11529.0 +X8MD0KOvHXE1g6R 7853.0 +08s07Nn26i3mlR5Bl83Ppo8L 474.0 +wT50ouOe760m3AyJ7x4p83U6 -2856.0 +2d361 -16072.0 +dF87w5r20 3684.0 +10 2459.0 +131Dphpt2j2FB -12348.0 +ap7PY4878sX8F6YUn6Wh1Vg4 -3684.0 +686HHW45wojg5OCxqdn -3320.0 +80EcbF3 -3042.0 +DOBR48RQx025y13q4767snyt -5495.0 +H5mOb2OF3E8oI25 4624.0 +sL1ht23v3HEF8RT2fJcrb 9519.0 +2fu24 10299.0 +lP7HUebhIc6T 8196.0 +k8184H 6645.0 +U8gc1Gs1Yw6kx4XNtI6 3709.0 +WL65H3J -13307.0 +MGsGfU7253gN2Hnt2W -5679.0 +5Y503avvhX3gUECL3 10854.0 +G5n81R5jjsG5Gp58vqNa -3597.0 +20UhDXCa138uNih2J -4014.0 +Y2C704h6OUXJQ3 -13177.0 +aNPQtU530N76 -1379.0 +21c1MADfD3n1QJ6j -7660.0 +o2R2bn -2640.0 +7hX1B0bSs -6472.0 +6MS6smd0Rcn3ld 9897.0 +maEsIRYIaPg 13454.0 +8NjevW2H3Kjnws2iC2qrom 11245.0 +TDC44S74UJWtQ2b3l7tQXq 6123.0 +7uC1DPghO17iHS4 14172.0 +uO4aN4J0dKv3717r8fPG -11809.0 +nF24j2Tgx 12262.0 +l616H6JH2J6U4263R41sP4 5263.0 +AFv66x72c72hjHPYqV0y4Qi 14099.0 +G87T0sx6ujgM -165.0 +01JwN1NVt1HU3sW3 804.0 +46a8K1 -8764.0 +7CMoc7AjVxXnpchvH3 -9162.0 +tJ7bf 16124.0 +ds5YqbRvhf3Sb2 19.0 +vALXyM54AgSH4e0O4IN -150.0 +q1WlCd0b5 -6136.0 +A2REERChgbC5c4 11056.0 +5KKYrlH3cWSmFE56X6tP 3285.0 +dU3yfLb6E1y0pxkF5V3q2ca7 -11098.0 +kRa26RQDv3Sk -13118.0 +2QK5G0sH2ja1J1Cq8kjc76JQ 8428.0 +Ic1W4QSJrJ18s0jnHx1N35 9983.0 +Foel1tOTi6t168aeq0sTSY4 -3343.0 +gppEomS0ce2G6k6 4577.0 +JgmG3 -3800.0 +o7QfkIJkvGnvlntbH0Ul417F 9917.0 +3HD1V6tKqe7gTGEC25JLF4 -4356.0 +Bug1pfMQCEHkV6M1O4u 9784.0 +08toVN737ni -12524.0 +iF1fQ7gn0qgpH7HKS5N3 -4561.0 +oMyB042otw5ib 3012.0 +GvcXQ8626I6NBGQm4w -10742.0 +pSueHN -7179.0 +OFy1a1xf37f75b5N NULL +NdtQ8j30gg2U5O -8369.0 +fJWe8p2jkqws5d04a5lSvLH -14942.0 +84r3mGgD287JAMVv 15804.0 +B257X5x 16191.0 +2PDsg 5367.0 +Xa2GCKqo2Tguwk71s21XMn2 11927.0 +q55wm56Wx110J 12378.0 +gGFiuV 10937.0 +Hh8Q8yObmEPI017 -8485.0 +N3K7NJPTO620OUo -1600.0 +6E5g66uV1fm6 -9886.0 +N7L608vFx24p0uNVwJr2o6G -5536.0 +xqa4i5EAo4CbOQjD 15218.0 +N5yMwlmd8beg7N2jPn 1684.0 +P1YjcPKUWkRD8SKp 11605.0 +e2tRWV1I2oE -12310.0 +037y7w5M624WjR07c6 2342.0 +3FEIL4w6ojn37iBWD770c 1414.0 +6Qb7hMltqN0MY0xRf8 8243.0 +21I7qFxw2vnAO7N1R1yUMhr0 15604.0 +8v0iU4C -5891.0 +URXvI2HsAa4AtO0fx58JYF 6848.0 +uxnt0fsrBtPD807 -14709.0 +2qh6a3is304PThbc 11926.0 +A1g0Myv7 858.0 +6Ld4Q60l3KhhGt6 1438.0 +Ag7jo42O8LQxbFwe6TK 570.0 +LHtKPAbAXa4QGM2y -2847.0 +O2aPT 13049.0 +lH3c764 102.0 +5Hy1y6 -16310.0 +PyQ4Q7MF23J4AtYu6W 2327.0 +wK0N1nX22KSjcTVhDYq -6663.0 +uXu1mj3tWs36cGpu4p3aHq 8059.0 +h8H1xHyUnDR5IrGqI 1822.0 +4MsDFIDY76 4745.0 +jK5m2h 6109.0 +8Xmc82JogMCeiE5 11982.0 +KMIq0X61hnjo1 9340.0 +Bbow1DFvD65Sx6 7182.0 +y3XV0j2p80 9540.0 +058p4c1 -13574.0 +7ois1q60TPT4ckv5 1803.0 +bFmH03DgwC5s88 3956.0 +036tLb -9761.0 +sKEJ8vy8kHWK7D -326.0 +W2mhptJ 8246.0 +qd5r08ygh5AivBK 4390.0 +txKwQS70d20 9766.0 +37ybSqX -4144.0 +iuSQEi3rpt2ctxK08ut3 -12574.0 +2y2n4Oh0B5PHX8mAMXq4wId2 -7961.0 +c10CM0 967.0 +I82Ofg1C8f -4493.0 +yF6U2FcHNa8 6775.0 +1JRm406Na8hu 3354.0 +tEO4vj3G 2248.0 +YpM63 -1587.0 +IyLp421t 5601.0 +52j4j3FJ6YP1qxTbH46a1 -5848.0 +taArL704d542R82qw8 -13901.0 +Vb8ub0i0Maa -9883.0 +8B7U2E2o5byWd3KV7i -11273.0 +KXT886hLF65QtuNe5MM36A 13510.0 +WhgF327bC -4837.0 +5nXLE -16124.0 +R03eo03Ntqej0VDQbL3 -1976.0 +DyDe58BA -8620.0 +R0hA3Hq2VsjnFh 9931.0 +vQalqQ -3969.0 +QTTWGUR2P2b08Dn62ea -16086.0 +60S63VPytWwf5Hu6j75cHa -4739.0 +7J7jjIVHSIjGh4oEBsox533 NULL +pECUTmRpXCoh4iVU0e -9934.0 +243SuYo3E -6853.0 +11gEw8B737tUg -8278.0 +HuetF38A4rj7w2 -9710.0 +3C1y7deXML -4035.0 +64ivIAGCT7J -6394.0 +4186Py40K286Oc 6351.0 +Bfp3iMp7A -13114.0 +sBGjdF6 -3036.0 +G45Bym22IHR5hd 1600.0 +37JyNK3B4QVE05unM5q -8459.0 +0oNy2Lac8mgIoM408U8bisc 14705.0 +2of2Yx7uYE6fE 5384.0 +4emY37V37o2B3dw426G7v -2737.0 +H8fHVjq8WdXUE4uRPjnyv -15727.0 +TT8P3I43af6MUGcC75 9266.0 +rWCcVpLiV5bqW -1079.0 +3T12mSFCYnrAx7EokPLq8002 5404.0 +JtE5Fxg 3418.0 +X75olERkL08uR 12481.0 +2g8EaK4cQPk82MpQPXlL54RW -5796.0 +WQk67I0Gk 2489.0 +oAUGL2efS4n0pM -5458.0 +aT5XuK -10736.0 +7K7y062ndg5aRSBsx 13991.0 +MJXhdk7vIa46PIHO5R67oc -11227.0 +X18ccPrLl -10096.0 +S2I2nIEii3X5 -1207.0 +fD6eaS1f 11158.0 +3t3EB 15847.0 +GhpgUQt6bUc8o8XVJuQ7 186.0 +1BQ22Cx70452I4mV1 10259.0 +fCw04e5L8Q6scDQ52Hnd 9906.0 +oaIPb217712Xf738 -410.0 +3GU0iMHI286JAUnA0f 7228.0 +384j1RPibybB6R -9449.0 +8SGc8Ly1WTgwV1 -6099.0 +1OQ5KA -4903.0 +E1fHP15nPQXjBxCo3u -12098.0 +Ru7fjpH4C0YOXs6E 6474.0 +f8iUpkOj7 -4893.0 +5ctB5Don6vvjSc6a -1786.0 +IA46V76LhS4etye16E 2402.0 +BS8FR 12619.0 +B4QXimuNY4jvyEB0o 279.0 +GpPrRO0c420y483T6l52sP1 5289.0 +lB0rr84T78QE8UDVl0e1qI 14187.0 +GFH0nk84rU7 -10029.0 +dPkN74F7 8373.0 +81TewRpuYX3 -7310.0 +41JX1nMdWvorK 3635.0 +L577vXI27E4kGm -11345.0 +iJ0wje577Op -7075.0 +m82LRy1eagTwDU1bceV 1252.0 +GHJf387 -9388.0 +2Fis0xsRWB447Evs6Fa5cH -9721.0 +VMlhJes4CVgyK7uFOX -10868.0 +BkETJ6DBO0vFxb6pd828TtL1 -1127.0 +mxjiujB8lLmd4 -6052.0 +7xINFn3pugc8IOw4GWi7nR -4854.0 +100xJdkyc 14519.0 +Ki4yIh3hXjHn26 -2693.0 +Oqh7OlT63e0RO74or 13600.0 +gMX151eyr85V6Km -12547.0 +0rtwy7qvCV34lod33 7468.0 +s5f66QOgSu0h0M3C8NfX2581 6971.0 +H1V38u -809.0 +rrXQo1n6PXke 163.0 +6648LI57SdO7 8854.0 +LAg3ad48X41nC22ThrX4 -70.0 +LeYdntmr2P7ynH8FtcbRVteN -12431.0 +N1uIFVXv1hO13c7cnEK1s NULL +7jMF7DI2PbNDel6Lm54C 13014.0 +RqGu3 -10583.0 +p0s376hDu -14817.0 +Bl1vfIc3iDf8iM7S1p8o2 -15895.0 +t0346137k7Lk0O 15044.0 +yvNv1q 7408.0 +S45s3B0rSCbDkMx3Q 2852.0 +c7VDm103iwF1c7M -14542.0 +Ck1y00F5 -2601.0 +H8MrS6CwPO16RoSj -12757.0 +q4QqIdrk1tThy0khgw -12074.0 +Jy4CAuL25v4JrHsIdj3d4q2M -11781.0 +p2bqd7rgBA0R -8303.0 +P61xNCa0H 10775.0 +K8YDBRohSU3621J3pw4m3333 168.0 +CwKybtG8352074kNi8cV6qSN -15279.0 +hA4lNb 8634.0 +G3gsRF 12814.0 +J54mWKFYUD081SIe -12288.0 +6bO0XXrj 11248.0 +x7By66525 -8915.0 +RHmS8V3K3lwHRXMOOQh 11156.0 +BU3NV3Jv7pW45knPt8 -13812.0 +v2wRf43gpDUt1lfieq -8072.0 +CjnWXicg77g2GwDWN1 -11947.0 +J6fBeMaj7b6M8 -16221.0 +6H463iHBu1HNq3oBr1ehE -13152.0 +70ab3f1kT2bN5F 6292.0 +TouYieKTG -9370.0 +7n7CK4Pg11vhm6ax3H5 16216.0 +10 -13008.0 +5k7EVDst86qAgdJaC -15168.0 +4Me3k5h 11585.0 +G35LCd6yIc0T02l4u7yd208 -14871.0 +Iw8wY -668.0 +R61IdER 1321.0 +AAeRTP 14367.0 +xow6f03825H0h8mFjVr -97.0 +V4Rn66rM3aHx5 13366.0 +lVXCI385cbcEk -607.0 +BH3PJ6Nf5T0Tg -5400.0 +4F3Tu14b35h26Q7 -4033.0 +4jYpLVDnj352U5rl72UlK0w -257.0 +RY5S78C4 -1612.0 +7ANVdSdbl -10674.0 +Eq4NvWHH4Qb -1911.0 +J3FC0FK17nbi6 9829.0 +W4GLKnA2Nwk0HJ 9528.0 +N2TL0cw5gA4VFFI6xo 1554.0 +dOIg2 15631.0 +2SDuH1XKN0 -11484.0 +4CLH5Pd31NWO 13840.0 +6ISl3L45y5Q5U57op34v88gr -11122.0 +8tw6WvMeBl -15202.0 +sTnGlw50tbl -2371.0 +cWsTrfWEqgH34d5rO -5161.0 +63QHPb4LMH52Rr52 -12040.0 +gls8SspE 231.0 +Lf85vk5I753lwILPp8YY 8912.0 +l3j1vwt6TY65u7m 11499.0 +s46Xv01xJ78KIw4A4eLLmwr 6047.0 +88SB8 -6209.0 +0tM3bkx6xWaqmX5XC8Md3h 5844.0 +a250165354I3O4fw42l7DG 14108.0 +Mr3q8uV 354.0 +3AKRFwBnv2163LyKqSXy -10084.0 +6c6b1XPMiEw5 -8731.0 +0p3nIvm1c20J2e 2066.0 +1Ef7Tg 5192.0 +fE6QXN3HR04aEMiV6AM8 11859.0 +vxAjxUq0k -12962.0 +1alMTip5YTi6R3K4Pk8 2130.0 +Gn3vmUxHWNV3np0 NULL +5N2rSTIXMp1 5478.0 +PC25sHxt4J 9052.0 +pCt10IJTv8 NULL +B7aMvVm446mg46CL NULL +fIjNh3dt21cMWe8 NULL +11Cjb3gHPUSjs1Dg3Co443SD NULL +W4TEt52sKL0ndx4jeCahICDW NULL +B26L6Qp134xe0wy0Si NULL +OQQgFcOqtpjdsCCejbvAAi NULL +08dVHRg NULL +Gb5w0aja8H NULL +12E1XSdKn04W1fN3ggwOv32 NULL +2Lkkts02qWf10RplnFExc NULL +xN5610V6 NULL +2401K84yO NULL +eDfHPeW364TY4A2Jhm NULL +4jGPKNFY4TP2K8Gw NULL +4Ma84C526OTHw0tbwxaQ NULL +1hs013 NULL +4hVoMF62WFn82 NULL +GY0R5v7a8x43DO5 NULL +4uJDm4ULDm3282Q32vwjD NULL +KsmxnX6DTb247Stt NULL +v74G5Gs3 NULL +V2Qo0J NULL +y0Mqh552G2 NULL +21g1f5Pxbwev02i2 NULL +78NRspEDoL7 NULL +h3qJh214D NULL +1oiwKGMsFXabXo NULL +G3a6E0Mll NULL +A6RKQvA5fWw6 NULL +8Ie6o54y NULL +p3DvmcsqP6xMf NULL +g1V8qsFsRDjt2MtJn NULL +65NJ5u6TD716OP4hB NULL +Df7N7eedkot NULL +11sV8qlJk NULL +u4xft2csSGhEHA45x NULL +xqYdECwBtABHTCkw3F NULL +QCqa3FP8v3D NULL +gjqfa41BgO5pRK03 NULL +83lsq0C1IyG0a0FauApW NULL +J6javud13C2wG244 NULL +siWyDsaIu NULL +dJ6UMgP76K8hC6dVfqFW NULL +1lH74g2m8G3mf5Tn NULL +kAr0ffWGEU7MHSKp NULL +77IBEt1Or1c24vWPvigS3w13 NULL +bc014i7354F36p NULL +2TtPF15 NULL +41OuKHD4wRu238388Cq NULL +wVkfWOQ NULL +uj2wiF041GHx NULL +f43bB2d6AhS8 NULL +6gG4WwoSJ887F15fK824g3e NULL +674ILv3V2TxFqXP6wSbL NULL +L15l8i5k558tBcDV20 NULL +0mrwaF7Lj8 NULL +7SDjFwa2o2KQ5FM43l NULL +06KkQ1787E25QFmGj87yjd NULL +2V6VBAtpi0QQD NULL +lNY7iOUnutV4p5nmt0pEae NULL +LOP6Akks01gG1 NULL +GV0Wt1N7Q NULL +s3Vu3wtVYOJbHGMLQW1 NULL +NULL NULL +D51v22DPjSeSplVUk NULL +8IgBmN0xkLDIlj2y NULL +CjhiR NULL +827237W7G6hlU0Y60L6Sm8 NULL +40vWkNP0f6DJQu NULL +J20OeVpcLCw5DqyWYV NULL +1w6mvRv543W805LP NULL +6fPk0A NULL +14N0bi51I5FviXeCQ03F21 NULL +514eg00Ro1RtB8GGeUCHYAqS NULL +KAO6W6 NULL +I2p1w NULL +u8PxNYK4 NULL +567H50IcGCq1a3u1 NULL +vxwTTLWW2SR5u NULL +Q6LDBb NULL +0m8aHX5yF5muTQW NULL +A4GncFvJV8J2o0 NULL +lCi03h2OY4AFXb34 NULL +RQ0w6D70LdsmsdP2fM NULL +fjIC8p2sYlu7rwnNYtm0i NULL +HqNMKJMV50xDX30GD NULL +pHr8j7sK3hQqSGPT1L320R NULL +B50OoxbIK NULL +8JNVrH3Lasa826 NULL +10c4qt584m5y6uWT NULL +1063cEnGjSal NULL +apkavpl8qlCLwq NULL +kTME0 NULL +iS5AY33Qun8O1UqRcPMV NULL +a NULL +u2n76PICX NULL +UR4W5ynqpg NULL +x5x535DWvIpVDYn NULL +woiNv162mnSJ NULL +6xn1INe8xSG0487IUAaMYRH1 NULL +tm85HNL7au4na NULL +F3u1yJaQywofxCCM4v4jScY NULL +kM4k0y1fqwton NULL +JvGVOip65N3hgA NULL +xK8VYEW NULL +0G60dEaeNN2vkI NULL +cM67e3WsUcSGq NULL +gfSFVGxrOrW0Bu3UuhmFb50 NULL +YE7I5JK87tW5 NULL +EX3K4E0EI1YiI1x NULL +R0mjxoFLf4 NULL +P3Bh3QyPL4c NULL +2QJ1CmlPPD4fLq7 NULL +a88x2Cl NULL +3VK3CE7sganaEC NULL +Kj0Rtt5r6bFQ2NGQ NULL +FNMnNPw2Ya1NHyBW8W NULL +w5bn2LhMiFin26r3 NULL +4p32f3dqm6X0Vyd NULL +ifm05ON NULL +VCpG74Yh5 NULL +0D6533 NULL +5SfTfH5QcH6yN4u5K NULL +b01GFHiSj4Yig1tk4bSex NULL +603r01G4J NULL +821c2733Uja2E3kEtAX83c0c NULL +e5sXd504D1x18iN3uTMsKIc NULL +707R5coSE4fhbU4ptKS1Y NULL +5iRDem4pt4 NULL +1lxocR56Tc6bWcLf1GHE7 NULL +Nf1SX4jg2f7nyT NULL +s2y7T NULL +Frlb0SoQ8 NULL +f62KPh6SmIy NULL +v2xYG8X7P8HjL3n83 NULL +NULL NULL +4f7D1im2ntLFeq5khY5 NULL +s5VX86 NULL +6Vi2T08qV NULL +g0AoxG8FyF NULL +6sB2kOb37 NULL +HF2p067p2 NULL +1FC278dD8i67Hw NULL +V8nNN6 NULL +w001v23l5b6tau7H NULL +eJROSNhugc3kQR7Pb NULL +YG6upJAu1AHo1g85T NULL +1N6BDpg65g6 NULL +miQXFj3fd8Uk388 NULL +0UR5vFxRwBc8qtO NULL +07l7e0adRi8LBK6xlp NULL +0rNlSy15Xy1Sx NULL +lsridF1nnI NULL +31RpuaAqBaH5ILfc NULL +sS4e8jrP NULL +CO2Agp0ngS0d6tcnBi4 NULL +2x480cpEl NULL +x6WK1U14M7IlWw NULL +NaDO45Xxri3X NULL +r1L2WTM NULL +poE6hx8xV36vG NULL +U3MM60y4t4Ykm NULL +MRoENDT50CoGq45C NULL +gY5CjIAG71Fh NULL +iurkQr677H1YV1J70rNk NULL +M4HtnssfQiEAD0jYL6 NULL +0333uXvwB3ADRa4aP1h NULL +E1K2fsDf8P NULL +iStQPx6j8SvMc NULL +8vKN51JNM7 NULL +m0hbv1516qk8 NULL +KH8n8pUDpPj0hPA6 NULL +62iCPoy17 NULL +3yeQxU NULL +fn7k8uv2T7Ifrg NULL +5mOUrM8o4W6A NULL +mLcj2Cd6L317mcE8Wyv5 NULL +E50C7d53L56 NULL +i1u8rB8WdUF8ROFmHnrs NULL +C0Ew43p NULL +v637OCF450C8k NULL +5mPiHh NULL +SK5274FsS NULL +OSNmJ7Y26rxub5G0301 NULL +5if5K NULL +t8Lh68DM18aEr4G7J7dX2Ee3 NULL +1meQ3kXTFFWELpid NULL +2YHQ00GQxt NULL +C71F2Bh8 NULL +v5Ai3KlB6mT NULL +i5nMr21nMygX2qWwtTbMag10 NULL +06Q47xVf1d5JSdb NULL +XFs4Txv64 NULL +S2XuI4SnrfBF NULL +YNsNwqw8y7D65 NULL +ytpx1RL8F2I NULL +P3p570gQ8 NULL +e13dNAo71UXm4Yt1u NULL +n2W51l NULL +mti5Im3g86ch3Hl44W32lUGX NULL +82V4K75apw NULL +jqhcD NULL +x28I3iV5XV870TUy3Fww NULL +o085ifc06u6558WpyJX0 NULL +kNAHl NULL +DP2B8S3qG NULL +NULL NULL +FO3Y3Dm052jfCS3WQ NULL +LAi381BGdEy78j4ke NULL +U6pNsB0e00xOD5JGR7I NULL +718J87Xo87S0x7 NULL +NSLFx NULL +1sJei0Gh NULL +2jU3jtuGteBoe0Cmf3gr NULL +x4330v264oRXtv7 NULL +qny4OOT34x7XVrWp5Eh NULL +s3WL6smnb7 NULL +I35E0Rr2 NULL +NEGa0N8MJ2dnn3MKAfl6u NULL +Q3F7MokUsoVf1xHYCorS NULL +Byv03ok NULL +JXySu NULL +KxewntCJ0mlktP NULL +BM68SI NULL +1f4D404j6JJn45418LWXBO NULL +7o0LS1 NULL +BRL163CF0o NULL +kmK1pk NULL +x535B4s3elsi8Cguc2432Xw NULL +oICOhMTtl6X2 NULL +b1Q3yX NULL +04w7DF25lHW4 NULL +O2U2c43Dx4QtYQ3ynA1CLGI3 NULL +lD0h1L8852501n NULL +78p35uTby NULL +2p7ND20blG8t2cy1VRh16 NULL +Y3oJ30U4LUuen7U6JjfaexL6 NULL +E0E7P7p84ltGE4 NULL +Q31pMN30tPv010W0U2h1s124 NULL +RJsFsi3a85svGBfT8 NULL +4yCd7wSAHaHQj5f70x NULL +h85CHOY0SM0YA NULL +l2845HIi20 NULL +TNaUMA6If0kmHQp2xRhqr NULL +05RA7lJ5odEHh13Uj8JkO15D NULL +x25S524hh85525J NULL +e005B5q NULL +gew1eby3AlYSvPICC3 NULL +6FY0I4YdYA NULL +oNWnPJA7QT NULL +q6iS3txi22Rj22Ks4Dd NULL +2AI2KkK774duG2okMaJg NULL +xO4e02k1jpEEwO80AwCHb4 NULL +bfE8u5XQPK7ie4o6wE1Tfv NULL +CDpW47u3jamce NULL +iEb04t2x333EF5wHoKRs6oKB NULL +SrPY18L7FKBp8WO NULL +64IHiaxNk4lo NULL +3EYb6FUI5ckmAd24bR7Juc0 NULL +32t5QB82iY3 NULL +wL8rYWQMus NULL +BwXBC7rU57 NULL +0eBe1 NULL +hwHV45CiW4O NULL +556IHnw5U5QfD4 NULL +kKL0p8pvX01sGT0I5203v NULL +I6b10lD8IFt NULL +1cO0m NULL +uXFnovL64803 NULL +Xxk00X NULL +C470S3c NULL +25w0iMiN06MP NULL +qC2BA3oYp NULL +dUEsVT8aX3Nfi801YY NULL +M3jjDj4cJP3yk67GlPULUx NULL +8o0l440qDP1 NULL +V5oM8YBx2Kq63oy0um7 NULL +pxUt0f57qNtt3 NULL +NULL NULL +Y3sLd5mt5phri NULL +rye3kBRGod1su NULL +X1haQ NULL +W3h83yyQNOicy1k7lw0Rb6 NULL +27pysB0Qg6oA8Cf4cjWChH7J NULL +mw3S8 NULL +vfY7008pQEkX2F315E NULL +cU6HuP4A323 NULL +Yj656R8h5j NULL +37nx5s6QE3F NULL +piK2mt5jDn NULL +035i4wu42Rs3Uu1ft5K0AOe NULL +Kk7EsvD4vMj2ijUnhyW48 NULL +J6S681J6JPB2SD6Uc08U1 NULL +4YW4ASjU70MkyO2biMUV6 NULL +31rhe NULL +lc8t8231OXG6C7DMG7Lqh NULL +Qfy07 NULL +8Q4H5tVMm6r NULL +770y82 NULL +rR855m18hps5nkaFqE43W NULL +l72ir0f NULL +kmVtK172xdC862vqYE468bJm NULL +2RbYGSs0tvc6C574BcmprP NULL +5cVgjDl5Vs7 NULL +j2UTaANoWtpw2co6Nj3bR2UG NULL +67CifPaaWjudYUDTB0IU NULL +FRrIYhIOx63k83E353 NULL +8E57cicQ2cn6Ld NULL +5u0iXh2Y84QgUXkfi726oF0E NULL +l44I7X15MUHB5 NULL +Jm1d3h3OxQE NULL +aHlYp8D37Q61Jk4Tk NULL +83tP8 NULL +uT5e2 NULL +8xLnT NULL +sE158DS55 NULL +O65HL NULL +bMKsgu5OdWu4vjTa1nt NULL +W8IM4inL46o67VXd NULL +mli7064t5U NULL +1381p1T7376j NULL +Tt1BcY8q3welBr7o22KI3jF NULL +4H51gSf4ykVH NULL +b NULL +3LWXOlGelGXQu64Lxws NULL +drQo4PU NULL +252YCGI2DXxpdm7 NULL +7aiqnEep0bBDD04D370 NULL +tKRUQ0e NULL +Wu3285CX753 NULL +j2dqLVpEPr87jVGVotModCHd NULL +0qh7Ce5WJGFQgK1U0pl0 NULL +6M744VRsSH88eIrG3i NULL +YBRSCj3Qdb24l1MnE5IIr NULL +dFE1VTv3P5WDi20YecUuv7 NULL +1RH526 NULL +418K4e01f6b NULL +07Hofhidd5ClnNx8jTl1 NULL +RsYTaV3rFO0kS2R4 NULL +ctL23E5x1d1 NULL +v555LQ NULL +bI55nJLOusG5i NULL +R67sCaYYhq3sQkA6aW1R0vd NULL +aH8tj4fj5to6URm5U6oonnd7 NULL +1wb02g3mc NULL +h4cKISr0jU NULL +ImYiNP1Y0JoBfQLbd NULL +V2075fV NULL +Anj0oF NULL +PUjn241mg3Qfjj6nG51 NULL +NULL NULL +3OpBF NULL +eJd04J4HSwx0RM6 NULL +701CeWq NULL +wtuJ56tof2pQf NULL +jKOcSGq5CIGQK8wPD13l7 NULL +dYqT7Ci8R0 NULL +561Np54L NULL +h5M1D3a1q528tDjybg8 NULL +8WC462P3JLhaXTN NULL +I6Yl6OVpH65i NULL +Sekt3bIDh7sr6X8 NULL +THh5lsUQ8a23g62 NULL +n6gL3434Wd418 NULL +8cn0K NULL +pq2i0NL1cRlR3CpAj082 NULL +8evw1sI852U4bid NULL +6bnEapMI6L NULL +x5Cq5v6cqx2fy13FuyI NULL +vcw13dF2uJ6S5GEq3P1QV NULL +ue3EL7 NULL +1EQPbIb2Wc0v60b NULL +bKj3K500DR2Qx1 NULL +22w42i7d7D2lhn6jfnlSN NULL +AIqMWf4G31cTSrfl1M6VKm NULL +03SnoFNyeHxQ2X NULL +xCsmnHls2N NULL +UAx76nB02256 NULL +yv1js NULL +XoNJiEg0S8u NULL +3p52k8g15nQB2biT1bn7 NULL +kwnyptdbU50K NULL +GX1nfv0HF8O3 NULL +Cd6HS76Hi77r7YGGH1 NULL +82MujA NULL +4UtjbA8bV4lkm NULL +a8b541Q2 NULL +0p5PiWBMN2nO0y88tnHcw NULL +xqiJqgi4N1AR18yC464f1FC NULL +FGQf6n21ES NULL +x15jGM0RqU NULL +1pxO53oqqBm2 NULL +jB10lvkjJlMJ NULL +Gn2Q3q7bvg6J56K NULL +6IWllEnT NULL +3yb1J836s0x NULL +1nnwS4QL88H4N4NItBY7Nje NULL +A72HPe7U2Ss24o0mmt58YXMm NULL +lOd6JubI7m75B4WJBuPkn NULL +XK6Y01Dev2K67i4224v NULL +rhOWNGEuth8f875WLX NULL +75RG2c8 NULL +Nr3652 NULL +sw21NM NULL +N334idEn4hyyO64 NULL +Xi7kOTT NULL +34KEcbvGIp1t NULL +nPy0TgiIloESA8nQ4Kkt2 NULL +6r3F47uD4in2 NULL +4W3748j3JCC NULL +4A7p4HkPm01W0 NULL +1110xVQF524nk2h2k4Aw225 NULL +c333R38QfrwRxL6 NULL +3ddyT3U NULL +YdRXUcPre NULL +g0Kgv01XSAbU8u NULL +2APHAC8q86BH3BqWiiK2PN2 NULL +0EnEEuG7h0d01 NULL +3r818RKi7V2ME3NtTt NULL +QT8H3G133r01VKlM3P45iP NULL +J1kjNdL12V8 NULL +NULL NULL +YXqWPGc NULL +8Fx0J88 NULL +EqAU5Jit8kJfgutgf0U7Ren5 NULL +Fe4Bfs NULL +538bk4x8fME NULL +4E4kmNOo5dbi25IJPfr05To NULL +3r3sDvfUkG0yTP3LnX5mNQRr NULL +QJocgOK5m46i2F1rfSCy NULL +27pDBUla2gH6KpsN0O0g NULL +5dENnx6VjU14iaLFV0IR NULL +QL665K2OF6nQ7Agd6Q NULL +7A80ue3836206PwI4 NULL +1LRgweD3Na NULL +GciA5Y0kP NULL +HnxkMvjEL0rF NULL +c8bml600KY814miIU8p1BP NULL +WhTuEkrt5Qrp5kj4xtFl8uW0 NULL +qs7r2hK1Pau2j NULL +Qk8f11O7Q NULL +LHow6beTFmm4fPjj43Qy NULL +wUV70PCGeAaauL808p NULL +1NydRD5y5o3 NULL +b0G65a66732y6yE65hQ0 NULL +Q0PCmMLk NULL +AQeg2Ym4L NULL +8TY873CPrH82JPwf NULL +DuLQkL6 NULL +LVM703TE5Iog006 NULL +c61SOJvyi4PAdi0o NULL +hM04012HKnNf8M7KhUi1x NULL +12l86v8r1ACbP NULL +R8B6PMUCp8Fuw NULL +HcbsR51rXDw7016fVOt83YaX NULL +7oGCjqpW2HtYrd6h2 NULL +5882EoppT NULL +HG52N6amN NULL +wO3YtYQ6XLp7w NULL +RhOnR NULL +i6G060 NULL +H37833CDTytf1mp4 NULL +vkbGEG4q11J550U7u5EnSs NULL +kNqRxj1O0747aP1iTC5W2N NULL +ryp70i8Er3IclwRg11 NULL +Or43Y6lI NULL +6iS3rFP5FLlyoojA NULL +bkN76SCX7oYleR0 NULL +2v5SC7L0SqtYe83ugkh NULL +ymBntQRx NULL +27Sk86k4X NULL +5Vypcl14RV5OcLe NULL +TBI20Ba2YuO44754E2BM NULL +mpos7eNU1b3mj5 NULL +rWDAhu0jHF0kmKoFd4kr03 NULL +225vmIW8L75bEWVwFc NULL +FdxyM7c NULL +N7jXiULOjt7xH2SgHwC NULL +B66gbJv648C5k08Xvd NULL +1emD5WuAWePl22 NULL +3Ea11tis NULL +701s1GC02Pver3F57aj20e NULL +jVV883J5rXAE5pI6qK NULL +75I0sKm1yRm4x181eDLU NULL +js4yrqYjb5asC5O48RlOoS NULL +5Q5UxO88 NULL +f60N6lQ1JF8TPt NULL +C0182BFsm3 NULL +6v1086YVc6I73mp NULL +3CrD10MgcCY1d5E21 NULL +Qnu2kAd NULL +M3Vcm3o NULL +1hsB1W3qV57jP4vG NULL +NULL NULL +06pY725 NULL +qA6qUar41PGaEoNus2 NULL +621A4nD7wucvR3o7l0 NULL +8jQqh182kkY6 NULL +kN1P50L5yeSw NULL +X48kUVK NULL +q8lY7m8OpG76x774s NULL +mPp7oQ4Adp2f7Hl82 NULL +q5k5l8H NULL +pHBBhXH NULL +8R6D2RO65Eml57fKYNV667j0 NULL +M32Kp NULL +eIyS41R32 NULL +Oi00P6K0mQf07v7j66QXRb4 NULL +djLQ52K3s5ReY3TQyWRl6 NULL +16T0Q0hg2 NULL +Qq3MD84DHC14CDiEGB7p04DO NULL +F3wAY4D4XxYt NULL +LQd03j0RQEIsglKmjFPuYXJ2 NULL +EjY6DSn57x1v5h NULL +6Ob80MBP350rI275 NULL +v0uSTRyX5A4W NULL +0siU5JLRoUBPi88Kenqg4 NULL +hw5maSbD NULL +jxNdt4 NULL +l35W8012cM77E227Ts NULL +f3ylU62g8n4VsaJawXV88 NULL +5wpDt358nV NULL +i06I7xgR0 NULL +A3lqQ7ei3m008SlRm NULL +s4LPR6Bg0j25SWD8 NULL +JIyVq7kh6B NULL +6kTCAoN08A NULL +aYu0vLeby72ti3L1BXRywG NULL +87Gan1I33d5v1 NULL +8lALowC26N0kJ371 NULL +yB5C57E21h4e5E NULL +Ayw2CUsH0QjG64m2cmDy NULL +Ylc4W NULL +15EKKV43LqDgt2DS1w NULL +3naCWc31dAKsWl6B NULL +bP3R4cDVvx6t NULL +p6umK8ea57Xg NULL +5ealv0e6tmDnoS0bOmX NULL +L8Xlx3485W3NxHr0q NULL +d52Q4 NULL +8reJCOg48gHGHDs NULL +G0PNHsT6RM4 NULL +b02HtfW NULL +XBfrKWaX68o7HCfKf NULL +4dYt6bF5xfHG2v4Fd56P NULL +i0o7RFi0 NULL +cSGwrp02p NULL +KXw5SRW2jj NULL +PGRP1R0 NULL +LXmcL8DQ616e NULL +u1DvW52x NULL +2wgUNj08KLsG4wks06 NULL +b NULL +BtFw6oEqg3wwdU NULL +3y1D3A7yxnQenJs NULL +ILH82L NULL +fFKkdcf NULL +TwQ5pcrWoA7l44iWn6r NULL +4eWh0BTSBEu2 NULL +3P8kF2E1f68xG6sWx8 NULL +h218Rb5gYs NULL +No3B0Y NULL +FdAhEb7oy3UhbF5my NULL +yX1Yqh86o275cYKdoU38 NULL +oel3s7Pn4wK NULL +NULL NULL +V3xf5QPg7EABK NULL +qbIAK5kn5p6x57grQne NULL +jdgDsOTsyP7Eev2471637 NULL +bO45EOf7qg NULL +nk8ff5B5H5R7Si NULL +a3sk76Jt1SL NULL +7c4q8O8ft1FuY1Mbsme NULL +100VTM7PEW8GH1uE NULL +N304RM2d NULL +1d8jOa45wiiv NULL +S6RMk NULL +cJnFkUL5gOyHR67G1 NULL +RG57safmo8UjXo4c1230u NULL +RtaC46i4DIukN7svr21U46G0 NULL +eAGNl00o8pA000I48 NULL +f5c6e NULL +xkFCXSH1788B8uEoG2IC NULL +YQv5p677HhxqP0wNOy3K NULL +vuNP0Q21M NULL +0KG4XT6262r NULL +0A2k346GBQ NULL +pguqNU5184b47aYi8g NULL +BJTr1JVEjCQMQ0 NULL +4ieWq56f7mIjQNs783D NULL +I0ac41cnFsVAkHmhupt NULL +6shc3Y NULL +Sw74GCctTG3OmA1S330EC NULL +6IVP5k05jNwj1Jqr8UAPD1r NULL +7660JjSpC0gG NULL +eVs446 NULL +34oSgU32X NULL +hO87j00S6nkbuEFh1rL5ie NULL +A74P2VrP7Ao34C87cV8634 NULL +k68DME5w7XXl NULL +By4JbbLm4g1Kyq67Er NULL +VC5R8kT0F7y3Y NULL +t78BN1 NULL +6gydmP72Cl38jkVsB5I8IWj NULL +WxJ1m2qV553MQ5vgJG8cj NULL +s8L1pvag0T7Tu4QvjKD NULL +qI8k4Mf NULL +H7s6xH4q88HKL2 NULL +M8e34VyN1iJ5IA80f5ufnd NULL +Fj7LiN85m NULL +36fFwTWHYaD563T4Yjx1 NULL +41xyA NULL +nhYqPVqCWQAeNN1p1UGq3AI NULL +xOSHRK0e6243CG0Q NULL +BseYtnk307lA6Q4c1Lw2 NULL +uGVS4blOlUNnx176 NULL +OTjMvEr0QiygFX856t7FPPlu NULL +uHdg0rSe NULL +6o6LI186a161V7N5UJ6Sp NULL +LBbgRmSXQxdgWwM48I NULL +3ConB NULL +qreC048mFnygscYQ6DuPrw NULL +D6BS618N87J NULL +nJl6242B6arixd4RTTp6wG3 NULL +BcTvH1XwLh0QJGAU2wA NULL +8X155 NULL +iB4VI NULL +t13ARgIU57 NULL +Lcat8FGEhBw NULL +JxddK7Pl4VF48 NULL +yURRTvnskWA02L6BK6 NULL +7SNpQFhk20XW6LON1g NULL +IGG1BJ NULL +3n32XXuwXR5ES NULL +5UuE7jmo6vi40e7 NULL +HJPWlb23N NULL +NULL NULL +s2N0j0FMB2k5hnMb NULL +vDFQ6 NULL +DJxhgDD0mIQeDgs8 NULL +vJ153TP7CVIC NULL +Md2lY0T7reBu NULL +1u4j8lva4XKq NULL +53db1o6XRU2CbwxytJFIg NULL +C77Mm2Bv5tV32bB3IHK NULL +XylAH4 NULL +q7onkS7QRPh5ghOK NULL +G6M7256nG NULL +16qqkM5M66EMI3uWjWy NULL +410uuUJB7nKBg NULL +5EjVb30Y5 NULL +41GNy4 NULL +jH7VH38C77M08h5GNPp8M NULL +y500EnnROOM NULL +R782cV4vNeIPfIrAoiWy NULL +0AkI4K24GeFC1Aa2Sr6 NULL +6R1Vtt NULL +kl11Ii2d NULL +wPdH65hLhV83741j NULL +Nd4eP1162w103p7cuq4 NULL +5k53084hr NULL +00k3yt70n476d6UQA NULL +818vxXu11 NULL +bXNd8y50350i1Chtw NULL +V6IvSow NULL +xe1bJ3w886 NULL +5F31f22Fy1tSMjqt800 NULL +10V3pN5r5lI2qWl2lG103 NULL +GdT0mf0U4Q0Mc8AFsCJ6a61 NULL +l2mbmOE4ih886kG NULL +07x1c NULL +1vMw7D5H1qCv NULL +OE4GQ84apBXD6 NULL +P33TSSHI7Y66Cw4lsb4h7Vf NULL +3weWVXQv3HgolM52OI2J8NAn NULL +0T08CcDm0fDWR25u NULL +dPbX4jd1v47r1bB6506si NULL +Q72e8c NULL +k3622pt7RdNlo4UleuU NULL +8JNt8dc84gCJC0tN NULL +1AQR8H78mO7jyb2PBF NULL +3Vl0BaJ372 NULL +N7ED661T508c1vmM NULL +HnA5J NULL +b67jQ NULL +6qdYTwkc3L5LGy NULL +jpl2ap113Lt8 NULL +p575lXH8K2IMIQ4qjma87 NULL +oL6efjpa0wqd2oPGrY5 NULL +VU42OCI8nDXA0M NULL +2a388Phe6 NULL +NlXgOC4tik26lq0 NULL +5EkunkVdHYCBxI30D36L6oM NULL +0qc8p NULL +0x112O1 NULL +c1V8o1A NULL +dNH34R81dS0y NULL +Bn7V5uRXt NULL +glmq52NQ3r NULL +mUY26uA6E NULL +qUY8Rl34NWRg NULL +S802T685lde NULL +aecE60o4 NULL +2450EV33jpg NULL +8qG35U66qmjIeLy5Iir6Yy21 NULL +fBTrfOGxGui72 NULL +qMFl3pK2e2vL NULL +QSdVNqav1efvKUht5o3N6 NULL +NULL NULL +7Sb0367 NULL +N17J6bKt243 NULL +H3fTKUU0Y5gdpKcO641j7M NULL +rOM61 NULL +6Ferlt3M8 NULL +y07NO37j NULL +mbc5yM1H41i NULL +y67hcqjKO4U8fUb0HQ2usfR NULL +q54KH4bUO6R6iedgtQ NULL +28DIm820euPTCMJxiNBtVF NULL +Wi0as040LC5n10bhhR8aVPV NULL +A2PcqxNGNI NULL +aiWFqnj NULL +G1Av5h73JFU7HEfj71hJ10 NULL +G4XIV50v8Ncd3 NULL +Le1vfH NULL +7WLVW6F4h71Dgk7 NULL +0un2h56KS7gYB37L NULL +733cqp8GjjmYR84G7UyWcOu7 NULL +QY2hg47yl0v NULL +qh3vU NULL +4YN58DH0Hhxv5Oc4 NULL +m818y NULL +0uA7It5CJu16eJ4JS1uuxNJ NULL +ebM416Q021xLQ0h8qDS7qw7U NULL +D47x12qBG7n82y NULL +euqLv NULL +Wg1pcPx06 NULL +6o50QhXglfo0TlCF NULL +s8C16hIJCvCdrOg3q8a1Go NULL +r72O13XI NULL +sFRsqLf NULL +MJ7Ej4tBYS8l2mK NULL +5b5ILkyshcQJ04 NULL +3KS55 NULL +JrReU7qfE NULL +1TBB2v0eBqlr4c7d NULL +72dKfCFk5Ec NULL +x4dhr4EV4J NULL +AMW7A NULL +0N7O6L1Gg1ja NULL +1062158y NULL +7GCfB5odqYDW1gq7iBWJ NULL +C47O7D3RF NULL +mvl88OrMd5O2WYb NULL +QypVV34u5H01Y4xfS NULL +N4c8u78LI12Qjau NULL +w6gGSU471 NULL +eKu2BS26qOY0 NULL +48fOGR7H6oNnh7m3Y NULL +8DiQ6F8xlhM188R0eyIOb NULL +1w7DPjq NULL +1P2TFQRLS8P NULL +Md0yyD6nXB1OBFdM2Gc NULL +ReN3066RXtQ3 NULL +RrsV1KTEI3yJ0RglUN2 NULL +b0BEyNEe1bvQ NULL +j337j4544rq NULL +33woPLwH3MFmK NULL +LdiBaUk NULL +M8YT251 NULL +2fbAP8EJ4D5sArmrfUo3r NULL +yFGTxJ7E5jp5bbJJe50E0El NULL +AuQ7FrUgXua NULL +5SJ2q18tk53g4SdDvlH3 NULL +TrVt3076w4QSXF83Io NULL +Wu4j4UNU6JLF70XKoN0X4 NULL +I1be6JuP8HeaA8UI8c NULL +4ifPMpwgOae51tiNLW7B NULL +2Is2C874 NULL +B5gq0hh5ud722DLrR NULL +NULL NULL +b NULL +2251WSv5eA2l6WqesdKPM2 NULL +42NY72w NULL +C63fh05R7De33TmqtehvIfxv NULL +ijmD5iqIymg NULL +sCUn521WGvm61MYO38xp NULL +o2IY6 NULL +3341180kSV NULL +GS7Sinl7k2srPHIdC7xsu NULL +Xtw4eM002sS1101p NULL +W4G22U32r8Ck NULL +CUa3sAF216u7IeQ NULL +dMFNhH2q NULL +8rac067JIBxRah56sw NULL +2tV7k NULL +7p5eY6u03Oc NULL +6n3S324AM NULL +170wJmORY68C7jdI6 NULL +rG7eG0M6IOEb007BB4Ynts NULL +MveCxn2pneC75WCdN76kovr NULL +HP835voXi4JJFIQH4Bj24t3e NULL +d05ua0EQjlFMb NULL +t6WHE0 NULL +41PLN7aXgP57M4Rr3 NULL +doI56Fdj4YgK3Q335155DC6 NULL +18LS1tJ2uUNc2X4 NULL +5Uh3u36dO NULL +TiI8AiopSL NULL +Omn3514WtBGS26q10wG NULL +wyxWr1DYsR15OYJWE6F NULL +61koHg NULL +5b7222ls0wgFVAff7D NULL +JSiXO2i7Cm88uXUES6EldW1I NULL +22RO52O0M1M01M0Uk74eGx NULL +3D8duxU6ikxujMiA3a1s3C1 NULL +ne2iF3QfSuKk NULL +6V57hA NULL +PHs7k4HAS63aJa NULL +x8RcAb7i5eeGulx4U200AN8F NULL +0LeTlxj6K50Te6uWM NULL +3kt58sfq NULL +0y7AJ4Mgm5KvSXXPh2802 NULL +hRUvK70d5B4F NULL +ePEMYxe7t8t45A1078305K NULL +Y4040E2ykhl2ih58m55Pfyaq NULL +n3ASjX44hdNqD7smp NULL +iaD4Rnj1 NULL +H4g4563WvqWkArS NULL +JKmY3010a4e NULL +uHkBp64 NULL +14272peG NULL +2H2X40NiXBIW2f NULL +B5ixKlEEhbWPV64wjMe8Os NULL +qEy4pcn NULL +76Gi03D76LwH75q5Qm8641aE NULL +2cNlfY8O65MhvmBjMq3MM2X NULL +Dxc5s8wD6v47 NULL +A30e7a8ia36g25YQc8xTXBgB NULL +7e6ntfBnB0m82i6k83 NULL +OA8N5i1UCdUv87i NULL +L2Ps4 NULL +h15Uw8Uidj2K5OYWOqQ5 NULL +6lk5XcgAmKuHHjg NULL +02v8WnLuYDos3Cq NULL +5844aXalb33GMTW NULL +Odc3l6Y0PG NULL +1WfqtP0V8Ky332UD NULL +gfkqq1a3n56XaYAB NULL +OlmEvw5VCuK8Cy8raUDS NULL +YCY6SM1FK83x0XYANbo NULL +NULL NULL +jXnS0M0vmQSg1Y61g NULL +02VRbSC5I NULL +0ne4VG NULL +F66v7 NULL +CXUWPmJcjj88pp NULL +dOw7MSwkn3F6yrvP4UN1Ul0 NULL +I1MWQo6y NULL +bopk3aa NULL +3ocGWW4eY55A NULL +Ju5Gq3IN77dD3541425UN NULL +hjKNtgUy NULL +Pjmv0I66 NULL +0Apbh7X08i2JyMK NULL +C32YIF3mQaXSTkCV8D2u7L7 NULL +6bf1hDU2gvI NULL +7vH6I81S0 NULL +2kQ5t0876n4JffOpftYceg5 NULL +K1gQm1u7ExEr NULL +7AJH2574A48M0I1wN NULL +AASM5H55Q142monqAx3u NULL +TLQnUq18RANfJ4L3nmmD7i NULL +fEg7R6A80Sc NULL +5Vd7QcLbL4c1d3Xb38G NULL +40r4yyU6T0A0Mekf24k NULL +cd5iw78V2n8N0x NULL +LfUyaaMR2 NULL +5nDHTQtR7 NULL +G82p1 NULL +142kQq4fbeX3mT NULL +12Y88CFE3600p4daxwcd1x NULL +667XJt2 NULL +rdcFjbu0F7yQ3C NULL +aEgURECDWj44 NULL +dlCRB1gt7D8hRQe6 NULL +5LIO05T80cT NULL +uXAG5QG6m60Y NULL +T0rmM12M1kobD2yqIsO NULL +bWhq42DR5G1Ypd NULL +pIO3OuP40U8U1i112A NULL +4y5o6RndF NULL +d5I5x4dq6tFbftHT NULL +3n72v2K42wYgtoeJrjhHnDm NULL +0Tm1yO56P2KC5O18 NULL +07488p5vb4d2 NULL +hA4vIK10755e76nB NULL +fCf8y2hv5UrvJR2i1mD0yuc NULL +5427N64msn31 NULL +UQv8T28745qO62T NULL +36E3s7M68N2 NULL +IjDM0V0b7savVtf2tbHOy NULL +3Qn72niu1tSo14 NULL +PENNSb206f NULL +A41x50OQPCeiC0M278DNC1LC NULL +2302W3RLPU4Hpg NULL +rXxvJ4hfXI2D NULL +n6tYV8AD327l7n7ErxIb NULL +41MRiDLLRHaL18 NULL +865ub2nreG8h0r7 NULL +8k2NIi3tY7t68 NULL +im6VJRHh5EGfS7FVhw NULL +71rC651of3swM7w13027216 NULL +5nV8bh0O NULL +HfdKopI NULL +EL8OqvHD NULL +g28jQ233uRHM7JG5E4 NULL +W3bnCmB NULL +06geS0K71heCEffYM NULL +8GloEukQ0c68JDmnYL53 NULL +NKh216VSO7v1mbyW NULL +M6567 NULL +Iny0u NULL +NULL NULL +mv2XSjHre54gnF3hbv NULL +q3XGm NULL +UUBET8444iJDvjUlq3en NULL +ku5VCfCpJH083A4byR NULL +2Gic14 NULL +H4fFjtoak NULL +6V8Ok8kTDSE86D8h0q06qi NULL +I642k31ww3Dpg87fN41 NULL +4kMasVoB7lX1wc5i64bNk NULL +Pc18F2c6iW766Vd NULL +G0QdT8I4 NULL +vh201uC NULL +CUaLDB NULL +6uCnyE0GG6807Sm0Q6UyG NULL +CE22Wjuk7d20ouN NULL +CKln3JQk346jaT47ns NULL +Uwyw8I50 NULL +8x2RxHAY2Y NULL +c2xCAAm6W24ho1Ett NULL +f5elgJP3k07 NULL +kA0XH5C5 NULL +p5Bb00wcT2cyGwwh NULL +jqTYMlhRr2crw1Oo NULL +GxsOc NULL +vUum3jv NULL +0OtfuTVJM42tR837710A7u NULL +8H81KcrcWG4xB NULL +61b7h3g8gQVJjx NULL +4c2KT50dog5 NULL +46aF585n7xBB NULL +kV828F822K7H NULL +3tARUFE5DqTe7 NULL +6olFV6c18IdYv6pBJG1 NULL +o1uPH5EflET5ts1RjSB74 NULL +1SJm77 NULL +nx6ptem0PKtsk07AIkoG5 NULL +Y00YWUI2gXA NULL +oibQ623k5v33kBUK8Q NULL +0sB8K NULL +21177SI08X0RDP7y70pe157O NULL +V746122yhMM3iEs NULL +R6q656btrqQM6a5nQ4GcVg NULL +78aNdayQnTX1e13sq1Bn0Y NULL +5R2j1whJ607JG3J1M811 NULL +N62KU05S73f5I0F77DK NULL +82If7B6m5DWsXE8LE NULL +LD1u8eTfXl NULL +7EOTdCSaFwhwSd1xuwGp6T6e NULL +2Amg22mSeD4C6OL64 NULL +8F0xRJ8Cf8S NULL +cW0KiR4B NULL +y0lPFKl NULL +V00PDpTXsnhkTuVbki5xL NULL +qFP23 NULL +cb5LPuiF NULL +IAX1cjB8p2 NULL +RVa8teOcCN NULL +Fh0xg4mjc7N4jCrkL NULL +W8A4i055 NULL +G7IJs50P82Y5G4s1nH52Y2j NULL +a7654w NULL +6IY8ud47LutPL77K0 NULL +casvJ6NR NULL +qJTKE1 NULL +a85tf8VS NULL +8eSO14 NULL +L47nqo NULL +8EGKOm NULL +vHIBETRJieO3a6px NULL +dcQOYT1M0S80x1 NULL +lqdd2uvmkyl4U1TYY3 NULL +NULL NULL +6EkcHQJ8dg NULL +DGu7ynB5SM3A864nRD NULL +m8mXw3s0A0chEm NULL +164334b43QNUJ NULL +drU0J0cDrY6S083r7T5Nd NULL +TjEG1 NULL +a1sV4Se71EjpRn NULL +XH6I7A417 NULL +iQq6r8j4suqBapdr7m35j NULL +8h4gdqCM0H8j1M2M052hSHS 1839.0 +4YJx505OYOoh0r6SnMF6UF8 1258.0 +6Oum3ppGek741ab5d888d2 -10011.0 +phQEM4MMvC74lr -13877.0 +Mp3bVu805l -7157.0 +B7k5EESc6 -1541.0 +2DOSO6D0pM -6467.0 +5V15opaByT3DY4 5698.0 +KRh240EDwPr2sS30cUTs2pB 10361.0 +S4Ww7287AGI80OOTGeN60 -5958.0 +eis5ky6Km 15466.0 +4fgGH1hKp6j210ju47F4 -8881.0 +270E55oU861Csr73n -2281.0 +Y48gjhCI3D7wk2X026ereD 9531.0 +pet0IMWH73YrC3UesG2jRRQ -1364.0 +N8Ueiln43iooW -111.0 +76vQ4v6BuhJ401g6U6 -6450.0 +SMeUi5ykXo0Vi6I -6913.0 +1JVmE8QhNpG6IOT36c -7039.0 +MB020S5OTtc8oO3iB08I4L -523.0 +0l4J5G2jaDC 6134.0 +8G78nBONNQCut4hVOKki -12817.0 +D7uQjIbBdnn -8261.0 +vyIcEkPjI -6359.0 +7W1JdVTdYHJc2KMvx6Luj 7413.0 +2618CM 6617.0 +0E4MkMvDVTEIU4B3 -10503.0 +KgXWlcGb1q0 -11092.0 +Dq1bA4POpt5yuC5L1t 1043.0 +HxBe5ucg73m6 -5904.0 +5hDJVR4lj -9818.0 +emSl6BHnVPfb3DF 7724.0 +5AKJ8et8E642uY4j6b -13856.0 +6dmGc73H4C2jRXnSi -4562.0 +1q3cS3s0IWSVPe0J -1876.0 +8sGhaa2c -11852.0 +P58wqaXf0alLttK226h6FPPw -1085.0 +r46qCNWs8wytcu7V00DM 3659.0 +8e5DWN6xSnwJyy -11009.0 +qVQPb 4614.0 +ptDyaGjsfXF2qxoM356K 15651.0 +36N3svcnLD30QwA6im3 1360.0 +P6TF4jQ 15752.0 +GfDE41J2VXOw41Vm33414P 7293.0 +fn2If82nABUmJ7J6LW 8127.0 +WkqBL6Dy843ehb30l54rQ3b 4942.0 +seo62 -10338.0 +6D3WT -807.0 +3VAKJ8mb2ABVNB73 -6947.0 +33oQ31 -15055.0 +VU46u4nh7 -15237.0 +kJFq4Dt -5706.0 +XJA0cCSg -3336.0 +882D66N7Q73Uk21Rh3i3Hu -9930.0 +KGO1w3WFD0CAuu 5840.0 +8FkV3 -3465.0 +wMb6J2r6x2b3ymq5eHKw4FT4 -4000.0 +88XSe1n -9255.0 +u2v3K7Me88Xm3Hqq6uNn -877.0 +1Uwni6D5JQ -3406.0 +QRofyh6UgWdm 14665.0 +t5p3LN7q -2596.0 +814ktH55a87815v563V81C1 -221.0 +mgG020Asp7uMt -6069.0 +fwaY4Kd6l4oW1Vxy -14480.0 +8NNQA83qWu5LDDj02 -12941.0 +LI5r3n388rMETn6 1008.0 +jTQ68531mP NULL +SW0it4ahVmrEGRrVT1QT5S 14849.0 +U0F6534QCV20j78O6681Fr -16225.0 +8RbQ4MgwR 1727.0 +P865P0DpHN1nLgB -3547.0 +ruWMh65eEPki6K 9604.0 +5712We1FSa 8801.0 +wnJJxqmG1Gf -2219.0 +6F6R3hOO17jki175 8283.0 +Qm31gHB65 -6193.0 +RiF2m743j35L16v -11273.0 +HTe03 -12466.0 +xN77uEfxB2JuNy2fe3hqu 14638.0 +eC818exjsX8l 767.0 +WIEX4XTWhXhLlUN2R5U 221.0 +Y0C8RDq78O723K8l 2808.0 +m1r44v7Vm6O6Et2 14197.0 +2004JF1 5796.0 +H1I67eBt4Lj6hL07 13259.0 +P5fGyI5L8Slr 6036.0 +JLoXP3cQ3g7Fh1kpF -4122.0 +fFWXv3oM1DRI7ELpv6kf8 10055.0 +58dScG1eiYxH -9013.0 +HLuX8 635.0 +DaV6Mq83h805DSGAI 9578.0 +jwC0SLy5G46s 1908.0 +72bY12xdTJH3jnIsdW03 3818.0 +74xqdI 16007.0 +5I8oh5Sb56pDl2V05R02 1804.0 +3YKfSH 13449.0 +4aE5M3pU0 7029.0 +a1hgKVq4wykLJ8271nHWvPB3 -8711.0 +muCmnW -5903.0 +l6mXiEhxA44hg6023 -15348.0 +GNN83p7 15239.0 +dpXsh6 2456.0 +1rr8w33DhG7xf1U 7263.0 +HpyPf 5971.0 +5i22c264N0CF7W 9705.0 +whtG7 -8469.0 +4E0nI655Vd0uNE31pU8x4SD 7628.0 +uDfpSf0NyIIVM4fEiB 7125.0 +XU3r6DD43W6431EtcFUhc2V -8108.0 +EHS5Xo4 14502.0 +7xo2E2XiGXV0uXEfBy8p2o -10094.0 +ywA68u76Jv06axCv451avL4 -11924.0 +SB5T2xl173s6i18r6 -5936.0 +JflBAt2610d014j72qx7IXHO 7462.0 +8kCu38T0uhtX8TsI0t 2039.0 +cR5KqKwc60t 6008.0 +gO13PbgBt48eAg84Bq8 -14238.0 +4MBCqDL6Ajkinmi6b66mV3l 12364.0 +rJRWWS1Td2ErG 8468.0 +7C1L24VM7Ya 4122.0 +effwRyk4TvV58kcP -1193.0 +084055856V0l -228.0 +vX63po7o5pg5pFy8x3B48 9031.0 +eQw2b7C8 -2133.0 +6THl7n0OK0Eiq7 -12244.0 +rtP5C01h2MxhU1CA -8692.0 +5Mh0fckJax75u8dlM7w -3821.0 +MT2jH3JvtKhS2 6578.0 +REq7q4Gr20HvT36r68 -11270.0 +VK8svLN8 -10871.0 +OVMDTY5Y4L8iaNgw8V3qrfHP -15289.0 +yn33iARirpWL4QQFK 5168.0 +XYWXe8O2Lst07b2x88yX 13554.0 +k2TbxJ8 -11044.0 +8W3nO2rOr026L8 6672.0 +3epPVP3r6d 8748.0 +ki62vk43P8QOh76A0XIc1U8w -16102.0 +MuGs8A1QEKUOppjLc 6314.0 +p008Y -10153.0 +WMIgGA73 NULL +j1BD3noYLxu -2022.0 +DRodCrmwkH35tuMes8V 4943.0 +ot8e575uIHCOn44Km8mG 525.0 +ss 477.0 +iiki1A -7393.0 +Cgxm73PXWLlvbIm -11563.0 +OU86sF3aM16q 2962.0 +xtj4w2QsaffI2p44s4A1 15508.0 +RofP7f28bOQVdiqDqB45Q -6041.0 +tlXM5ibrE53xkj 3268.0 +bXmqr7WJQWrLR271l -14948.0 +6TgaX4LO 12505.0 +IYn0ytVO134cGgRH1Mo00 -6274.0 +472NXRAi53NVuETqVanD5l6 640.0 +L85qF6846XR20TxUp8i -10150.0 +PQv3N3YYx -3072.0 +Y18g03MSsp7t11J 6886.0 +w3KFMs0WYfmy3vmXIoR5K -8315.0 +7PdUcgGs1W2es 10867.0 +GT42YMo1UNyUyuh 10454.0 +3EUchdWMUIeH -10291.0 +13Dmcbvc0 11177.0 +wwp1nVv5UU85 3642.0 +hSOv2xDX05WjxI13 16058.0 +61u4nyOWkEKfsnkFsDWYr -15640.0 +LH7Gx2g0V3EV2Y1J17 14028.0 +GMmPjjyXyvqt1bpEVw -2580.0 +jWVP6gOkq12mdh 2538.0 +3l2B8dk37cU2tI73S74Iw 14266.0 +8Eg3VyND -9816.0 +rwQVgJyb85BtCNlnXM47008 -14159.0 +8R3EG13518F1O071Xy8 13710.0 +m6dt2aMaI7P -15891.0 +604G83753 7562.0 +aR5lMx65ohf25L6NBe5O0JL8 -14345.0 +nj1bXoh6k 34.0 +3TI27lYx84dA7T -3488.0 +CqVN87Pm5hyraKaq45O 1005.0 +BJPV6JwJ8p 11614.0 +BS36Mx2tu76K 5654.0 +2060qh1mQdiLrqGg0Jc5K 15011.0 +K4lBe860 -14283.0 +JM6Axp30xv 3946.0 +E8p1D7g26MAGrt616dfRC -11828.0 +RemA6I854lkA3IFqso5b -14709.0 +d0gyx37c36ijHBhwvVqm842 4806.0 +dRxyUb0v2VA -9160.0 +74Qvx57RdhAO3v4JB -8958.0 +OP2o26bb8V3 -815.0 +kf0sFoH0CK1HEIOTntq -8708.0 +36VNqaapb4Y2E5l38 10377.0 +IAt2dH2QaCv582C 11231.0 +3obyVy5iSrWwgK7R3u6YHi 8381.0 +HM0GBe1SIB0GMA8274T21 -4809.0 +eX01IDE0Y7qmepEq57Gh6x2 -7123.0 +3E1ynn7EtEFXaiQ772b86gVL 9583.0 +ROLlg0rtT -16172.0 +3q0QQv5fggdv 1206.0 +oC2tj4g4fu6El3f0IIEHCL0V 5544.0 +7iDJPlr1E85 -2378.0 +Gg6B3fm2KvV4mnVO08GYQd 13553.0 +7L6td4208eOQ1Kvq220 -8173.0 +O8Qu7DJOCJI63 -13211.0 +xxA3K10x0O5cjk61 1391.0 +q2EuT -3581.0 +Q282L11WWFni6av8FGn 13894.0 +8bpqjd66y7AER2QoK -7021.0 +X57jtRW1LHg 4863.0 +6MmsFsevV 13877.0 +WBT2XnSX5c176OF -6789.0 +23w7BrP228j42Elayn83Vi -14148.0 +vcIFJE8PUC -14079.0 +A063k5 NULL +Pm1l0q2mlqmy2L55XFdLrx -10489.0 +1ek48 -11946.0 +srm5RkDFn4rR8X6HI76XEcG -733.0 +05qf7K4cL0 -9263.0 +emhgE87754iUcRPl1vf -8548.0 +LxPISu8dfmMlrHNr 13179.0 +577208620tV8mWC6Y 15902.0 +Ysm7SDldbQqRr2qRm2XE0le2 -474.0 +0t7onX5VSj3h 16376.0 +in6jU6Ke8n -5497.0 +3x3rDvQ1TE6qIo -14329.0 +Nt2mbbKT4IdOj8Cgh 12321.0 +Wv6BkKRpxN 5698.0 +kM7800unA1 -161.0 +1527XhEpKMnW2I2E7eCu -11824.0 +8w7oRLS1 15861.0 +cimuDJm856U6ia35Q 477.0 +ocqmW20m5 7841.0 +y48t5jOnFXm3 -10558.0 +GlxQ7y5rMDn40jXcQA4A3UNg 4868.0 +2vCAjK -5057.0 +HbE35H3mF 4852.0 +p6571t5q0rx -8974.0 +7u65oy5nW8B -83.0 +eYi4x1MVI7 -4165.0 +k461t1SjcE7 2384.0 +uS42Umy03u16l1c6 -1943.0 +UExcNQO 10133.0 +YT433hdTP2 -16183.0 +aV8Pd81 10201.0 +P1OsIJBOYl -15441.0 +1WAm0QJtWv06c15qd 3121.0 +UYfsscw4LauF37kk4 12688.0 +nE2AqMgKO70BOfdcsRg 3926.0 +81Rg5rR0IaInWw -3942.0 +Ku22N3ec -5544.0 +2bc3O0wh -3079.0 +uBIJwYqo60BuBK67YHwF4 -879.0 +ddB0uwG5vP6efRY28vx -8737.0 +41MThX -9836.0 +OAC52E50O5i -11865.0 +h4D3a3pF8s82471v7 -8579.0 +Kr84i37e2e6KO18IBoHSHIc0 -10065.0 +F3OEU67i11yDY0Lok02y6 3944.0 +06hsr0Q0bQe 10456.0 +JHGoQkiiNx0K522UDD4 15863.0 +3VI3qF5L1rHaYfdh -10967.0 +H3N013d41ipMop 12134.0 +5t6nkDHD1Ls8012Cg2 6463.0 +m6Q36741pMsD5JK -8059.0 +EgNL5xh01N5mU1iKCWKFQcfn 3372.0 +L4N36wrG -9746.0 +JDWi48mC38uf 12470.0 +1RN2A6iFf36F1T2a1Syj 12099.0 +OsgSff3KLTaXQ21Sh3rKJ1 6863.0 +kTJ7LV3 -2537.0 +K6J1LIb5 -8836.0 +5TI6JBd6 -7711.0 +I6yTE4ellX8C7 -5119.0 +N7Cd61u56HG5ih0AD2u6 5761.0 +KX1Q20pJWbuqe35t -277.0 +0042l0d5rPD6sMlJ7Ue0q -3622.0 +IJo7wcG3SrlP -8762.0 +y3WX5 -892.0 +73JSh62cDpvx33obP7c 11772.0 +4lBxj4Um88 4597.0 +B6Sx6ydj 8079.0 +w624FVokyo7m7a220 6544.0 +Bd1f156OCy1u -4773.0 +HpsjM0 14260.0 +ip3Y6RAg87Hgr3u -12137.0 +cbo7HQc NULL +ccaAm7Y -4435.0 +J0XLG7KG22lDNyU0 1790.0 +Y7vBl4PXIPqRBJSx3sd75 14445.0 +5vYQ13d84b7f1326iS6 -2081.0 +66LF5V8Q27044V1J -10311.0 +p8wdUiqcj165fVm 8173.0 +UP583HP0cV24I3o5MC54l0F 7688.0 +135FVb62E6 125.0 +IAwj1cWek32011lq1J8mf2d -14688.0 +TxL3nqa285133l 16127.0 +bFvG3S5iJh0B1vsBsiV42Pbb -12684.0 +6vl6871LI44R1g1A58lhDH5r 5323.0 +D7nv643DTrg0H -7610.0 +3QUVFRtWix17GBQlFP8kF 3492.0 +I50781U82Bk0 575.0 +jkbOgXoEr2m1mHMHw 15336.0 +oyxhfOgpr -2565.0 +EavI0LN82c3A1UN 4762.0 +bd6LedV7 -5511.0 +brlusDQ60JO68Qx5r6CY -6439.0 +rnsAN8b6f12ci17I2BU8rj -10119.0 +6Kf33n60w2Roh12vlTn 7505.0 +ErbOvqGF6Yyik074 -3350.0 +E20mj4rXE8p38WB0 -10912.0 +631404U8x6HaGp62LP6o 5468.0 +ga113oX5cQ3BKfs 11118.0 +e8VT3kOBd654uL7eH 15490.0 +B44Mnpnu1Fv1M 3241.0 +qFh46ykfDxXFKD 11681.0 +hu6I51nNlePTerleQ -4005.0 +fEU8HAO6NWJjF44X87 -695.0 +47dILPXIlxYFSSu 5495.0 +HPn23UupQ -1729.0 +4WElvvXB261gE3 -9379.0 +52033t 14980.0 +22s7l8b06mB7664p -7803.0 +fduo5V7B450uUI3H436Q8 -11838.0 +A6CX2HDWN8 10852.0 +x058FPu4i1B7v1W 1373.0 +6V8P632qsh08uP2oc3o 10933.0 +y1mlHr4Wsy2t71KBUvcX3 -3042.0 +e3H7id0B6Vk8oY 8455.0 +3vk7hJ7ur64k4n48i2L8om -9435.0 +s5M42C4544f -14860.0 +wa56XmVPK66nC1ob3 -1295.0 +2AFlPMvg7wgi45s4J 11437.0 +04RSj8yWf6GOxxq6B37jHlTO -14128.0 +t52yoB0 -15824.0 +H5e5cVK87a2m16gCSNtgI3q -1387.0 +re78ik4v4GTRW 6747.0 +wwQoIT73jYdodDKWu27T4p -10954.0 +7d13Iix50R2X48opJt 5664.0 +v2K1jgoFtg7CwcDte -3631.0 +2Pcm3 164.0 +4Y2uw5v1YJ8Jsq7wPSA -14569.0 +032Uf58fO -428.0 +122V22t5dxC876kB 15522.0 +wcOt34D461JG1PC2qE4014T -13539.0 +88RyHpqWAT8f71rv0 1187.0 +7XxsQY58e7QTwB83 16140.0 +ucy5R35xJMJ 6007.0 +67V7N05VD1IM37 3086.0 +3fAi1N4CaJf1CpL2oIV -10320.0 +K428Y0T0R2ui6S 4695.0 +hkW5538D2R46LB5t 8119.0 +xDJlfn 12426.0 +REktKOM0feNR1k -14431.0 +g72r712ymd -14173.0 +HjNA1CEw6w4 -2191.0 +2dBEmWgC3OK06DpPc78Ew6l 12456.0 +F8CSOeOY1K85PUlf -12957.0 +rw607T5rxKlE04761q -15779.0 +0i88xYq3gx1nW4vKjp7vBp3 NULL +kPhAAl8l 9571.0 +8xij3lSDUdgO0kEVm2Bw8JRW -10605.0 +UD71663I2qu1c5pqA2Kf1 -7893.0 +Bue8jN31oeS -1944.0 +Y442l2y0Y5rdjju4tIR 7409.0 +kStdI4lGTUx 10289.0 +oef73LI0CC82Lo58WmaLE6 9185.0 +U7GdiO -5860.0 +UrDe6x72B5ycy 12961.0 +h0F64HhMhM78JIo3tWkVN 1594.0 +2mk4x457Jc0apJ 12408.0 +FWCW47mXs2a -6839.0 +5RyN2I4gSo 3658.0 +XR134uVnw0 -15020.0 +l81s1biPH -9437.0 +6wSoiDE22846jIPRH87 -4682.0 +0WwMu34P26BUdcVu8q -9163.0 +ss 12329.0 +G5gF05ux -10578.0 +h1iuKxGwo -3442.0 +bBM3EEnw13S0y -14831.0 +BuPfkehWx0mcq26yta7bf -16201.0 +4Q15WWw0S -11661.0 +03ej428XuL0ryi86e542 -15091.0 +j0Sw233w51d1PQ -11142.0 +kPUp2tP0 -5767.0 +EO25LXi25UV6oD 14081.0 +4xV5SUxYbcNcFk 11596.0 +rN3lL6o2iL5ivV1nbA0HEL7E 15821.0 +6Uags1mv741m620LKQBQ75n -7862.0 +KF2uQ3u2s35eysuX7s48R05 10997.0 +uY5BRu6VpGUPj4 13237.0 +CCm4BXjLPAys -10314.0 +7l1OMS06fGPw 11324.0 +v782YnRD5 5948.0 +j6BCm4g8G2k -2906.0 +W45L2Xb54yhtJMWDFb 8700.0 +YCSg3CF070FDEip2r7djAA 7571.0 +ceKdxB8IQVLd7AMLH32PV -2015.0 +2v26F2Ok 1629.0 +hyUX5 -1089.0 +2I805mn6PngvT2rj 4199.0 +1M4Nh6OhsxQ2XeIDW03q12 2312.0 +U8s5kjQhx1t1g47m0A66Yi3 10916.0 +82TqgL1CXYgKl4 5018.0 +83d6qEj647pMQC7 -13439.0 +Fm50h7GKQ470RHTNW1iJ8qs6 -13701.0 +FL21OE2AbCwyN8c -8132.0 +0rP6A8v2S16EOlTfIDW 6268.0 +27lDtVbT38gR -8969.0 +lFt0AduV4g 11971.0 +GQnJxB67 -5964.0 +2M016T -4134.0 +xvB8xiamF7iQXl 4898.0 +l8a3n6TRqVKuh0j14h3 -4213.0 +NwuQjkMCF4KqgmCh1D7PH5 4090.0 +Kroshtr 5815.0 +5qS5Ev7u3SoIqva0jurc0I 9360.0 +gdoaNjlr4H8gbNV -8034.0 +04m0G4 -10278.0 +nySmD256M7wH3o -3486.0 +3kv5ra4874pD8G3FRJC 8224.0 +KRm0RfHnXwI5lA0VO5k7e 6088.0 +vp8Wvr40Cc3xhVFK230H 5389.0 +0CIbHqN05doWKk36Q4 -11506.0 +5Pg84i1bGapv5qoYCrtvV3VW 7161.0 +A5d3WY0X3i8b 12585.0 +xQ1r67vRih6x4 -9655.0 +LeatLR1l 11104.0 +0UrqL6yRfK -770.0 +4m4yDuu60Po -3566.0 +nb3VUGJ43oIooV7XsQYW 8317.0 +7frh87sO28DX NULL +DtnT3Y2qlp5HYmS -5334.0 +6lcf7Qp -997.0 +P64485rj -11565.0 +Gk7eAq875sHou 10475.0 +2LwwBU36 11865.0 +ab7c7YFq68UX1Po 6778.0 +UB2u4GH6Y51e 12779.0 +eDYumNXO773v5X -6767.0 +1S8S88v8yJQW5cVKm 15238.0 +58R6lyHwWi8r 3187.0 +S8H7q -5689.0 +x7psT1pPat -6940.0 +5EK347RAoD0E2pw25F6Q1mFC 4954.0 +MY5E0vP2 -15241.0 +O8cWpb -7070.0 +IHuJh -26.0 +5dy3B2G0T18JX 3147.0 +ro38o4NlNPb6wM2O00 -6638.0 +PUNia61 -6079.0 +F1eRVdjR66sHY20F -7593.0 +317wH7BrLo671 -8153.0 +gSL2wI2m2i778C3WU 11602.0 +tg58cJrNgk8GgD20557cC3P -4692.0 +XGUO2CP2gvDb 3540.0 +HcN230scg88eow4b -5086.0 +3a0wpaDU3V 6838.0 +5hnxP2wPy2xu 11603.0 +knO0j77 7889.0 +mepTjD 13128.0 +qCsbyUH1Ra4DK5fJAbo77MO -14397.0 +dpSr737SQ81Ww2xh6c 1936.0 +4evX80TlSNP08l52Dlq1dOKD -8393.0 +swx5K33Sm5qcKR5B 9.0 +RHAKc71wc7w4iNwmG8g8GT7 11899.0 +2nioOF436ID -16243.0 +0Ew7eF4wD3Oo -5338.0 +uoG8KbB3mx561Q1D0 5983.0 +6G76C41KuHO5okBwq -8636.0 +xwSvVvb 8026.0 +7227l -15886.0 +7qYP01VYV7LgSn3bdxRcv6RI 8058.0 +yg8gQ7 15928.0 +ytj7g5W 12073.0 +47x5248dXuiqta -12888.0 +TLrbx2m635Jg8 14572.0 +Mryf6uJbjJI4y 14070.0 +CbbC4f5L6l3L6k -28.0 +76iHNk3p 1751.0 +v47ph0F5 -4990.0 +RG82Im42Kp 16261.0 +42w66x1PK4xu0P6fuXd -15951.0 +2Iu8hD8x4NyXVo51 1806.0 +1um44A551e -10887.0 +b8uHW6ME5uThM 6504.0 +64ouy -13615.0 +3UN38KH8 -11587.0 +AL03kjYOWmhlSL7 14208.0 +Tuga7PeYvD460mTs1paJ8He 777.0 +mQP7F870yu1q2k2 -1282.0 +o2j3542 -3748.0 +x768u 7912.0 +Y8ktTV23GelYC65 15250.0 +6iN0jrPL8I11 -7607.0 +5aKn0fEo1T28d73Ntd8DN 12502.0 +56Q41bkHqEF5446pGgJ6Jj -6455.0 +5Fytvc0SA8G48x0B 1160.0 +W1w0N6QI 5201.0 +5Lak148nw7OyU7Q 9652.0 +3NXGGhNOjVMRWV -1465.0 +LM30M -3544.0 +14xUC67Kd7mcnC3 2706.0 +p20f1VG8h 9417.0 +kdqQE010 NULL +pG5PyRueL2604N0Ox40M -13750.0 +pE1ogG1QvOu0Wabw6xaK7 8128.0 +u72Vho4R6 -3105.0 +F3f8ccwGF -3360.0 +wwnv4h88cE7 -2716.0 +axFM7O3Cmu4Ax3y0Fmd -39.0 +ne08407 11253.0 +d64pbe5ih0aYr8gR77 15349.0 +ffuO8wdQSN7ExGO -3043.0 +V7sUJ07Xv4b74g -4661.0 +d7468A5L3hm8c7gYb2 13299.0 +0CjRwkbxbqh7T0brNr01 2823.0 +s1WatNi4yEaK2v085OT7 1610.0 +EtktiuSQJDs18 16134.0 +hGgIokL8VLdv70x7Co03QOvN 14031.0 +Eohh21 11674.0 +M8HJdPuVmG5T1GM3jqjsKg 7384.0 +8tHGDS0N2uj85 -1606.0 +41ET3yiToLbb 863.0 +GdK381w3v -11863.0 +MOdF5501fG -5423.0 +LxB3GrxHyeem1fekvgm 13126.0 +I6E1Y 9358.0 +CTGvoAMolvq147 -12956.0 +xiN0c0LHCfyNiq463C3s -6651.0 +YeSkUwB5tOhwVE0nJfsJvo -5814.0 +4s0o0KVP7H3EU753v0Y 7235.0 +RR75iYIk1Ni2005Ua74s58cY -807.0 +A5ps3gmcx07K -1997.0 +6mDJr6FCiu6d12VCj -10502.0 +kW012gtVJBy1mh46YAdw 13386.0 +71L3HdDt342V8ky 14894.0 +Jg86cfk1Uc4jL -11638.0 +id8wug16 5679.0 +78P3GRrMus -1791.0 +3tluu 11726.0 +OP2JURmj 9729.0 +1bVmr6A03dX2uSj -5951.0 +v1Y4DKkcK4dji3j 12369.0 +d3pn8 -9898.0 +bhG6Fq0J77 6693.0 +60h3hwpEHd7ay6THn -3923.0 +0h45LRqh8jhT7sxcubL -7382.0 +Yv85R3umfQLpMkcqJHS -5170.0 +aa6sWJ28wU1wvv6it 13650.0 +4Uh5kCybH -15867.0 +kE4AFD1BKG -11896.0 +w72D5glR5VAi3S7 16341.0 +tVopY8s0qF0dNI2yQdJXOX6 -15865.0 +2vdVp -11832.0 +kvQ24H8m11usQrSJ2X 13914.0 +gBg7S1x5obicN -16030.0 +RsyD82XJvE3bY83IP0 -15906.0 +mo7jS24bQ1gHL83xV1h -4242.0 +2wg3vWU73P -1583.0 +YEsQpLvkf0vcXjWhQo4 -14150.0 +2H2FnbDdb58GeL7kE2 5474.0 +5wwtFk8g4 -2477.0 +7Trpkqliv5w 3270.0 +jeH4F8mXX3r7k5LAE0D0S2 -6276.0 +35veP3L -561.0 +NN4Fkgp6GXx1fv7bLx -8607.0 +1Q6X12GH8AjV1QTh0y4TU3Vm -4608.0 +84CIr82 -7357.0 +CRP2ah1peUgDrj750RU53l 3907.0 +2TWTx 4772.0 +4LtlcjfB4 -5811.0 +3uo540mYV 7194.0 +q7pPmH 3549.0 +R5G2op1F3HcO13Bn5aKjSN 10058.0 +5MXAF37Wk4503wh37YOO56 10455.0 +OVJrt7Ag4JY573PrTY NULL +337CVUc -9400.0 +3r23H05wF1 14706.0 +s1144yNh6c8C172Rt35gs8W 208.0 +kTajVEl2cQ7Wbn6j 14449.0 +xWn856U785i3UUXn1Xo5m37R 15873.0 +ik3r8Ug0xoL8oGWkF8CWUbO -7591.0 +0Dlv8g24a1Q43 -3422.0 +6m3p4wd4i7GCSm0PCO 14835.0 +JPW8Mvvjq2GJj6 -8534.0 +6b72Wg1nICD 8219.0 +0Fx62li4 9588.0 +8a6xVdr21Uy 11935.0 +fx6tfesnSixgAl5h 2951.0 +2TP8Ryblc8A01 -1702.0 +MD7aMN1a0s7S1H2QS530 -2815.0 +LAB23hT5 -6993.0 +26k31c65n85xP -13598.0 +Y452MvjJO04RMqES3O3 15530.0 +ni8pyeGYTqXIHS -13938.0 +mjO2T3mw 8047.0 +27tTvOU3G86FdnSY74 -4438.0 +kb663 11582.0 +Q2B430rRMeowV73 1212.0 +O67yi603cB120qS -9096.0 +jT4878c3Xl6Td2He37E -8681.0 +EPGIl3Mq6 9719.0 +53OS1HM8 -11797.0 +0a5Aa136 -6387.0 +tsIiMQx1u5H 5326.0 +m8C11PImKtamThR0fqFIg 4631.0 +8nU3Geor45VFUs26 -9776.0 +a 3350.0 +u768s 16169.0 +JAT5D2Fkpd5FC -6467.0 +soucv -4302.0 +imHOGF5tr78FHO5dM8JFlRI -7247.0 +3683w5f61yvbWKD71qtL8K6h 11516.0 +D7G7Ubc64866fFh -5198.0 +Y4TBnhowH7L2Gm 7964.0 +rUMy375oEX854bi6Q8VU0Wl -10558.0 +Vn4S1kpwhJ016S007em56Ll -3937.0 +5cD132LLXI13CK5eGM 5867.0 +8IpUdD64akX6LGbx 7040.0 +gUpuTY5eI0dujb -13570.0 +I7PxStf5Gs12BP07FO 2910.0 +V8bPJ6NC4k -2697.0 +lcsLU34FC2CqF8nq6J5 6688.0 +mq6H1L8F72 1836.0 +yHQAP7hAbHM1I0U3CJS 10869.0 +v1jmDcu 14183.0 +Crlnej6pMKb -748.0 +3yAAXOS -9296.0 +v56YAf71SP32 7519.0 +LALDOC84aIS8V1 3122.0 +jqs0Bt0nT166j3dEpU0RM -11034.0 +D64qsn86uCx0AFCDKU538 8654.0 +X5yxXhH276Da44jYTNH -14533.0 +eMf071FkRwWIQ63 -9419.0 +JLB4Y 4012.0 +r78rHjV753fk 2505.0 +fy80g 3514.0 +0mwvEC1g5p7Ai5p3VWwc -13963.0 +d3gFFis50Wy6FG76XeGT5Ou -7255.0 +26X2i11X25iC6x1KF 15130.0 +aQ6My4WFN5vO -5909.0 +g4teBBvh -9188.0 +Qg446fs0y6K5wk4ly37V -14224.0 +a8S42TQ83u641QM -14240.0 +EX3gUtFMk1Pnuhs5v 13368.0 +hX448PDJKp50xo -14521.0 +i6bSV5cidX0CxDqq2f5Y 5724.0 +3X6iff67S3 -15516.0 +k7wEYNyqp3SlI NULL +5F33L3INq76oh68VPwnc45B 14963.0 +2xdvQ 13384.0 +442rSKupjwM -15748.0 +EGLa1s85 394.0 +04yYaarM36u3dD3Ho -3794.0 +LN64uJaOEGiHX0T8cS2 4672.0 +iD2KrmBUbvNjuhHR2r 9296.0 +8kGcCA5 8092.0 +Lp1M1UVg5gTdy71ilu 15089.0 +6T3G2q7oM51doi66vO 6545.0 +36VHT5MyHq0Ei -7021.0 +8h8C80lK4l6 8745.0 +FY6nYvlylGTw0vQ544uJ -8043.0 +Gk17JaCg7 -14518.0 +f3t6786LDH6E8RV8nXU6Ep0 9828.0 +B21noFx80 -10415.0 +Ut5NYg5XWb -12328.0 +40U0TKk6diRgJyuF2nNRvwX 8759.0 +5LI5OsAUx5KfqojNG2k -9604.0 +r61k2JwKD1gGJ2D33e7C -9076.0 +15nhBUmm0Fj7J2jmVgEE5C0C -6747.0 +833RMHSwWvEg01S -1639.0 +xWu1O6561qVT 676.0 +dLYpl55rytQl5 -4011.0 +Pk628E4Tl5b -3105.0 +ie5lYXc8JAh00p0yd15xb 3679.0 +4cCAsIVs3 12009.0 +gcoE6Bkah -5622.0 +dPDI1Xegw -5307.0 +Ww2y51r3L600x -15212.0 +2xgkuN5E8h7t51 -15816.0 +Y1jTLjDyI5F8 -13787.0 +40n4Pw3EiSUL2e0 14373.0 +idV7C76V518CeEHos5N4g -13148.0 +U408t6TLdH18sJeyO -13012.0 +67NuMjv428MRK7O 8521.0 +u131Hjx3FGMXm2f -9619.0 +V2Dy80R4bnQX8s -8994.0 +yoNRwSSU81i61K3hua2O 10486.0 +3USqL4 -5121.0 +bdUdCOP6OR1b2AtN -2572.0 +WR23n63UMj53mr6v -3214.0 +560K0jDFkQG50aGtt8SVA 13291.0 +VcK8V5jpv 11182.0 +j6KUDTK 13218.0 +jvoeAUueO 2724.0 +yHf3d -13269.0 +WpFX83866M7mrm -15851.0 +P1tjCVg3C82le3u24xbJ12Y -190.0 +1n7x4rXnvWH4wpAlqR 13331.0 +2W4pf6Qy1bP 11437.0 +2oWrqUD1xjbsy1Q2Ecoa0CG 522.0 +p5P22Rk -4855.0 +g8n6YN 14027.0 +6lv8V -11234.0 +i2nn656t 14188.0 +ys1mmD631lAyx -11121.0 +Y675q0vY538 16266.0 +DHw7or6 -4628.0 +0MGeqBDWUco 7620.0 +kJPN7Y1u 12969.0 +7S271S3 7097.0 +xtKOiPbIr0p 2731.0 +nhj3SmtyXgjE1 -3252.0 +p1BUkkuD8W405j86h7I0r -6403.0 +JNvHHPxCgj8DDGXQ4S4J 12479.0 +akSq5ElsFg 10225.0 +mtvo4jtnXR72iN5I -1797.0 +F4J3N2IsV4JvOl8i0B -5378.0 +x71s6pP2W5A7O0H35Up1cD46 14827.0 +W2M0XkTK4jth34Cm0c0 -10528.0 +w56Uy63x23B4T04 -15785.0 +P37TWjlF65Y NULL +rpNgMwmWxO0SJwG3hWA 13731.0 +aQ2wqmciE6f76RG -11623.0 +Br10oq82CD25XOpViN0OVP3w 7894.0 +A84V2Y4A 3387.0 +0k3GM -4670.0 +1gEDdyI -6296.0 +Qd6E0xuPQ2Q3cJOD4k2SV5M -13228.0 +m82354y40iNkH4 -9073.0 +34ETSx805Wcvol7f 9603.0 +MKa5eNCgK6M7H4LHIve 989.0 +iw1Xi4d6QnFiPEVoRb225UE 7744.0 +CjC3BPy1KH421o32f8 -524.0 +13q2kEQ65Y8EY0S88y7uFa5q 12214.0 +ob32BBHA 12486.0 +0ruah 756.0 +3t072wsOIw022u12 -13551.0 +rio3Ll087p -13430.0 +Bey152YLpPVVmJ36w3 3629.0 +ojkuXpt1U3654 -14905.0 +IN0pT43W73j0viT885YKU16 176.0 +CXpa3gF20 -13944.0 +LSX841mxv72hO7 553.0 +Pg2g8HLPyO4vOPaFdg 10537.0 +04Q88m1uOy0RT86F3K7 171.0 +X7L6W 81.0 +QP4koLS5P7NSwq5Ja8480606 -6364.0 +L2rPI4lTVflM42RL3fu5 -7484.0 +rni4i5VH11yK82veGW7N1 -6312.0 +86c88IWA7d8EK2N -1865.0 +W3P5WMsmv6UJnfph5D 10429.0 +cuN6W1lBJtv3PFN7UdoLX2I -8704.0 +mLlWTu1n3334s132WJ6QO -16.0 +8Ne2K6rxP6Lllx1c -72.0 +0ciu8m3N8Mds44yxps -3705.0 +0AgcEEPHf4vXNU -16149.0 +5QXlOox5GF 12404.0 +6U50ut7NIQ -14776.0 +owIkpnSNVggUyb 8437.0 +87SexCLsDwtqFHL73T6255 13618.0 +V78Fw1q -269.0 +Csi0Uf 4059.0 +41smYLf4cuu65p1 12220.0 +6dATrG 8984.0 +s4ga85hxKLgh -102.0 +q7GeFu8AaI0XBU5P0I3fGJJ 11393.0 +qI2D4Q2j 7824.0 +N1O7npivCIR77 -4633.0 +Wqob22iBp115g3sS3RCy6K3e 10550.0 +qwbeQ0ja8su2 475.0 +Oi4wXnLvOLI42 -3849.0 +pBNqSt5nFMF 13160.0 +25f8XNj 5728.0 +hQAra 14460.0 +Sago0hfsWqeGkVo8n38Hh5eC -9519.0 +1Av1DMN8BV7 -3789.0 +8UL6BjDVbGE3B6tlmdeP52 10069.0 +83c65JF048U86Gsy 6578.0 +2hOb8J1 3699.0 +kKNkv78jp3Mj522njGl4E7YY 13554.0 +nmin10bW3n3x5JdK -12357.0 +522FH212n -11376.0 +7k0Ypeij4V2jcvT66TW5 175.0 +UK0lin57gy -7662.0 +7Qi7qWR73P143aR -7441.0 +42rU7 -1638.0 +Bu880nx 8782.0 +7g5OT6f7u1A30FLeC06sv 13308.0 +683xqGH06ttCI5q -2305.0 +HfU3sd23vI54H4y -6377.0 +1ccoB38 460.0 +ju45wjK1f1KUihMix 8713.0 +yv3gnG4a33hD7bIm7oxE5rw NULL +17tj7wL42AfkIWb11q1d6wwe 2251.0 +F08xx7g2V6CB0q3y 4002.0 +82LYD2g04BheHqsm0 11799.0 +a01020v7267VMksO75bI0 9905.0 +dhDYJ076SFcC -16296.0 +CxLLn 10997.0 +s7Ct1y6ga8FJla5 6882.0 +i82vCQCIiC16TWidK37m7 14159.0 +P6ueYr2 -7508.0 +TI3s2Wwu6V5I 5265.0 +6qFCTec4H4fY5YnL4esu7 -7609.0 +RkRIURA28W -9594.0 +13YQWi5 -15534.0 +cT06r11FDv 14043.0 +211K713b0vBiUWYr 9397.0 +oV8amDc 14891.0 +23I1IWV72hJD8Pd7FGk8lS 680.0 +3Fv6q4 9863.0 +EV6iD4RKEH7F4DJV 12628.0 +3H2oU6X61KsBGr 6071.0 +tu7C3G1Sg65n -925.0 +RXUV8A0GA8efTk6PuvunY -8943.0 +o2raBqIkd0pM3 11449.0 +f3oGa8ByjMs5eo7462S84Aa 4278.0 +CFJ0FK0U143Js1C433sB -7645.0 +55W7c 11528.0 +mAcsi1fEHaxOHRvg -9164.0 +bULnwrQ -9796.0 +101n6n461o -14640.0 +K7ra5 -4790.0 +4JmPDMvrnJnjYB0a015e 14093.0 +s5O357fO5pF0 -14005.0 +p0Piu7bxB3FI504 1712.0 +HBWrcQ4pLka11738w -179.0 +6v614exqRd6KU 12181.0 +LW2YYOKsIxYejJ3tCDEs -10093.0 +x1j2lFY5YIM5 -3056.0 +yujO07KWj 15600.0 +J4m3I -1687.0 +K3imEW3S7DRihILRDg7qq -10928.0 +CxevjU4dESW7kcgYUY01x -2184.0 +4j1R8ITWf5JSIWbP6b 14617.0 +i54P3 15340.0 +MMNg1j0L2 -7152.0 +qob43Bl 8892.0 +10 14771.0 +3eRIt6koMhrPL5C64 -10980.0 +3HlOeEUFSLcdPk 16171.0 +Gkj4u7q -12819.0 +u030o07TS3M2I -15002.0 +35lk428d1BN8Qp1M27 -5039.0 +K27XxFR7JP5b07DPwL 16343.0 +W4evHL60eNc8P3HVs 15038.0 +kBjHVSj8v3Xvx58q824D -9624.0 +HUV1KPXXn5Wvk -11181.0 +uVO0e7Q1u05gN3Q4LRGo4Xu 14208.0 +j3LaR1p1e2 -2849.0 +Ej38vEPdjT -5715.0 +01oQGbtfGX 678.0 +xaF6s1Ylv03U7K61yqo -15470.0 +fo7hQ0lLo0K78 253.0 +275JjYk724e -1655.0 +c5E4j1 -2779.0 +M6fqXU5eC -262.0 +pS3P0LCrtC35055bFm 14671.0 +OdKPu 1953.0 +300gt 10663.0 +EwBPJgY4JDm 105.0 +uq5SoLA7n3TbA 2308.0 +ecYs1527OxTl 980.0 +vNO0KDA6C8y4t1bmFaS7h 6961.0 +0qcrw48qRprN58USuMjd6 -15520.0 +667DXh55Q45p77fOJ4j6 NULL +63Bc8F 10363.0 +h0GHsDG38rg700WO7D0EuG13 -8576.0 +I3w7NEK56OB4G26h7MU -79.0 +gm1ouRn6LL8IvrB 4610.0 +u46nE -6297.0 +i5bJlwLtK8 -4896.0 +HV8VCk6oGdeG71 5831.0 +x7YBL3aB4hG0uS -59.0 +XMFgr8DLLoX7m2en6X -10476.0 +P8MKw51H -12151.0 +gw2d6kEFV35L7RPc61vpc 14202.0 +M285Wp6 3700.0 +626YHDK48bST5D6KNHL3 -5226.0 +LAFo0rFpPj1aW8Js4Scpa 2719.0 +v2Y85SxC -12576.0 +oLxMcN0501 -12086.0 +m1Bd53TD 5512.0 +QUnIT4yAVU 5133.0 +df3lR0B 11795.0 +525Nle4MDKGH75d 15847.0 +f0Gw70hO6b -11092.0 +D47gT3qx6tQ51hCO -12242.0 +ksgjhJ -16008.0 +D2cd5 -2179.0 +q0EJDU2Kd1D10A7XeH -14875.0 +2EwNEy772jR0Adg3 -15566.0 +8hI2axJ4xQc2ilt 8148.0 +IJ8QBH5I2 -8208.0 +45WlaD0HipAojCT -6060.0 +n3M7aAb5257vTBYg747533L -8342.0 +5c5pKk4sUhqMX54 15319.0 +bTT4xqcq -2477.0 +O4g51XLy16E6ANqm -73.0 +HBtg2r6pR16VC73 -3977.0 +FOFRXW66k6iU4jUcdYKC78h -2032.0 +315P3EH1I6vi6 -13893.0 +63HcQ7E3o2M73mtoUlsr1 4025.0 +4o0SAld6t67x881120Otu2 4130.0 +A34p7oRr2WvUJNf -7382.0 +W3Ox658xU7SX7gBNCs -13028.0 +EEr7sgEv4lqC76GKb4LI7p -4405.0 +x11H3Bbq7N -16015.0 +FdU12l 4549.0 +ah5Eixq6P7Q5 5558.0 +27Xm6ui 8773.0 +10Yr6 -9489.0 +v01881axRfcHYcOkUbLMA7l -7367.0 +NjjnM2LBF4a6Ru3V11F2L5F -9716.0 +47XnhX -7700.0 +Ik28kU0xl50FU3Uk4opJYBA 5218.0 +R4220N4v 8587.0 +DU7L1P2nx0y6387K6HrltN -3535.0 +YAF7MKQtl26DO2n6AqHW74Nf -11633.0 +88Gp8064umWOY 3290.0 +Myso8FwW4ov0AQ -8163.0 +055VA1s2XC7q70aD8S0PLpa -12485.0 +Q1klq3EyXKfX3523gIQ5n4f -12585.0 +kDgST488GNctbHl -8040.0 +S5MwtN1mg3CO46HGJ0UrK1Ab -5229.0 +SE4SQ1Mk7n50W7832a68e -9681.0 +M342Il45i225s06pbi5BJe5 -14936.0 +arVcY7cHiMpnKLp1tj7 -14171.0 +6C4m8 5517.0 +MyQ868wQ7iUnX -737.0 +431LM1vmKy0K1m 10524.0 +2WB7711J -11074.0 +XDk6RIOI658Y64W6 -9639.0 +CR57NnVhHbrfuaD 10368.0 +80gvNBSa2gsK 14782.0 +dub50S584AxqyPI0r80RA3ks 8482.0 +0p7O07686VbFeGpK5Aa3 -6981.0 +xknXeDuW -5126.0 +4LXBIdqdsL746Rf NULL +oVbH3m8HbK1lc7T23YH57C -13932.0 +8f6s7W5E4823 12690.0 +smOO3dT6d2rlivDo0LD 1382.0 +MjI4i6E 657.0 +771j7A2oQyUEA1gti -15121.0 +ovf0gMXhh2H86Alw2C0 2045.0 +HPeuF -4059.0 +ct55nKy6085wEBl -8391.0 +Y1B7s -13161.0 +7QlOGyGCDX8Prdm 654.0 +FxEvW 14694.0 +nxyXsB88u 3548.0 +2uE6vb52q 8524.0 +eEn3GIKD1RcY5tu7BH -7424.0 +5pQgNc6aqws4H4mOtk4FIX -13644.0 +MowB20mIxthiV3 -6353.0 +0J74Ryg8 15682.0 +4bKIO5xLDn544QH2 8591.0 +mbSRX2iAr46 7480.0 +7uXaLmLAl6CsJ61pC14htB1W 16310.0 +1n4A087jV3AdXoNYLUp 12257.0 +b0m3GJH2xd -9871.0 +JfbKgKX7gbq8s1d5QJj7F6oq 11796.0 +x65DlyX2Q41Xq7AEIS6 5831.0 +Xl3YYF83e 7270.0 +Sv5fP736jr43u8dlx10lIOwi -6764.0 +1047piRsT3c3r134I 8659.0 +Y6L2obKBywPjBP -8980.0 +d0a3qw2gtsmG2 -10213.0 +ODS2ChEt6148Hijbbe7l -11662.0 +X5PG4t5RM68kF 8744.0 +ak3wct6anGAdab6IH -13323.0 +cQ8To -11827.0 +346v1tVDI4iB -2049.0 +0OerNktBX10PyHs1sE -5249.0 +6255bIgnJx36iq1nNFiQ1 11685.0 +HrSQbAWX2F731V7 11310.0 +J7SUI8OhGQNq -541.0 +68QfqfP1AK8f8 15125.0 +77752s462NM3V5Flwuw6t -8413.0 +S7a45WOo7 3844.0 +JGw3BC7C1R2gjvR02kQg -11548.0 +ka7bHiM -4522.0 +s1Tij71BKtw43u -11535.0 +sW5pS8s02FERo5xGn0p -5282.0 +yVj2368XQ64rY25N8jCGSeW 12302.0 +g5su4Pm4QR6jx 5770.0 +8I1kuCMp7I25yji 15248.0 +fAlgqr6d0P817Xv2 14120.0 +36b2dm4iGWVn3wkl1A7 -2619.0 +HV2K1WhShOVtguITMU 16336.0 +8nHEnu -7465.0 +36g21Q 384.0 +I22Uu37618CP747pe5 -13111.0 +2kWQ1XKrr6K5THWA3ck250ab 15662.0 +86C34fOeI 6113.0 +t6C0o5n7Hl6t5M488 -5864.0 +17RI340fft1fahy586Y 9180.0 +0DM5PsdSMaTmhOK4YxC5u7j -14990.0 +OdF11J0B1b5v -14356.0 +eWc3t8r71Mlq -12374.0 +rke7s862F7PCfCS6iOG -3423.0 +1WRcDois5 -11392.0 +abD0Sb0Xj5M72xMXQWyUaJ2 -5426.0 +jKQKJXa3DJGks56Si1cENL8 -7150.0 +H4gEuhB 9019.0 +3kE81u6MpejF 1069.0 +203a3lQM031om7ei8r -13144.0 +Q8ypy3QCBUcVq6H 15085.0 +wlc60R31OuTq86r2K 14504.0 +cFBpX7cJIRmrVPXg0CfP 3225.0 +EcM71 NULL +DP5Ce5 3466.0 +m7URg62x54HTfT 10412.0 +iggCGFADtrd6k25FD4r4375I 11461.0 +s78853HC8E -11781.0 +5tP1Y43S -9359.0 +W6863eA -354.0 +7D436RM5BwJ2ykbsgu NULL +8k5161277021n NULL +57WA7Sm6RuEiouyjK3 NULL +MQ0fqWv7k48r6kw NULL +bq7qevqgOC NULL +KoTnkL5820App0hb NULL +6DH2dA4 NULL +yg503l0kDvb NULL +2Xgj2n NULL +bGBcSi10VWt NULL +6Qpnvx8GDLewljdK15rHn5Ur NULL +74aYA3Gbe0GnVm6lR3Vjh NULL +3p6nJWFNC6 NULL +YU35V NULL +olVf5rV613F08s065p2JdM NULL +f527p7MLm6Griq41TA8cR4 NULL +PUn1YVC NULL +RsDHrL27QLW NULL +pcnq40qUNuY54 NULL +K55mHG1D07 NULL +2Kkk1q2T8Wfedft NULL +nn4BmhMm71Dr4R7sw8Y1dQR NULL +3rki40 NULL +t804ie NULL +BYD32YqIWlOgNpL NULL +6m476JFPvAvlp7KTyU5C NULL +T6ubsbx62cmP NULL +wdn8BMwh NULL +5tdqo738BN NULL +G666cWjnfHEpEXGA2Ar1 NULL +tOiw4 NULL +JPh1g4nGHIT0 NULL +8k6Lo3U NULL +g4Gl6D NULL +i0NyLxxV1f NULL +k08gD2etHEq NULL +357GvGhVK0325aU NULL +5b38BDVq7FrK342c0iI2w26H NULL +kwa5Mim3psM NULL +20ub5m0Qgh NULL +2j2W3xc42VkSq4Nh NULL +u6aAurTkTTuKL3gU5s6b80SL NULL +342N64u7yB NULL +Cxas82oA2hX884xmYQ2jrpDX NULL +pPDa1 NULL +74KfTA5ji7V0 NULL +4nKk4I7T6I4GruCj18 NULL +5GQ6Wm675hwy3eAq3m6NGCUL NULL +gSJS1mpb5Khx8140U3 NULL +U3w6s7fnQOxVv0pOLHmEP NULL +s4q2UkuM0 NULL +x5x5bxme NULL +cv71a87hIMbVuJ2dAX NULL +70070HP7Kb8Lrj NULL +s5unq NULL +6PpbCyjf6c88b NULL +NULL NULL +0m6YOPivJ0VtmA4R6 NULL +q4W42sg6k NULL +YY7Ji0cFe7R1 NULL +ce6C1MhLw NULL +s456h8r2b0jAt4Ni3qopHCxS NULL +pr5tSeG7X NULL +KPS5d134FEJJu NULL +8Mp2JEiFxAfApNR NULL +akfWVGu2g0io NULL +m80sprxq3O4J4YC6gh NULL +xbQqalYlo NULL +10pO8p1LNx4Y NULL +o4ng6l8 NULL +25Qky6lf2pt5FP47Mqmb NULL +2v5Ux NULL +iJloCx17VlmyNl881XJ8187 NULL +47INeW44yvsne46Mu NULL +YQb5VlQtDsThbG3YoBfy NULL +PflAmQ3KlJImr NULL +m1vJTYp8GEA NULL +FvrWP NULL +v6lPjluh77k5 NULL +OLGDak48jmju2r2v26LQIlx6 NULL +kK8gg NULL +8jE8SDSLqc NULL +5308t82fc4 NULL +XWx44KOWat NULL +woeLEb NULL +vRRg2BqTsJEV NULL +e4j6pjQIS16PPiA86wnd4Ke NULL +E8O8814lE4JkJc52Ure NULL +HgP1PNA6gggV0v0L801 NULL +HfAollgq3EG6 NULL +Ni0502Nm8 NULL +Y3y7fhrNY0jD3 NULL +KFSPYD NULL +pek1nHrGOn8u4tof80T NULL +TJ0dMNm6s44r77567jk5 NULL +bK1Ops664m7u46sIF7Cgn7 NULL +hLEVieIhDXuQ8W2YF NULL +5qlw1VJGq2yHFBrf14 NULL +GVsdgDhg NULL +xYc4JeNp63 NULL +2SOiwMlQ55T05111LrY5 NULL +gk0kJenBW237uQoxGBx36 NULL +HN3I58 NULL +C1E8E3vVL16j NULL +8L3xdOeN NULL +6ljwSqpl7n47 NULL +oj1YrV5Wa NULL +K34k7XH40NxjMX1dl NULL +bx3NrGJIw088yHD5461A NULL +x5RVyqgb1TH NULL +Rdj0Jt0pa8fLFYq24hu3UR NULL +3tnGS05xI820jmhlJES NULL +8Lh4G52x4 NULL +658SAQuUGC NULL +mOofw7T57kng3V161Mg4YYK NULL +bM34sI6W5h NULL +FMVqyn08R5kuEv8 NULL +Js07yFa2qnrfVU1j2e3 NULL +8ndB1604 NULL +GEO5N1eUca NULL +wM316f6NqGIkoP388j3F6 NULL +tXve4IPACHEIJ5773oNyco24 NULL +qx6dp6KHBQHn7U14fdd0Rbj NULL +3KB27MO3K1u5o NULL +IpqVS NULL +WML05unAVOf1F5IDw1S1Yv1 NULL +RS1Ec5u4hvD NULL +316t3Sw NULL +NULL NULL +vW0LEIWb7Ck4mWgc6cu0 NULL +Qy84s51BfLUtbt NULL +64eh17n32TkR5g5bvt4p NULL +8iX3Lj03 NULL +na3L437oF2C7446q567dQp3 NULL +Ub176WlT6f78Y5s NULL +70a3Xg NULL +drGld1C74Thqq38208jQ7B NULL +3C388PPl50v NULL +taaQ17IeHeH4rk2s0HeTKn NULL +3FhN0p4lstJDMEtXC1005J0Y NULL +767fOfF1Oj8fyOv6YFI16rM NULL +q5E0guLgv0q27xbrMMv NULL +vu46n3nUvv7ls2K4k18tvw NULL +KKQ82Pvc NULL +0rtl1C NULL +b17XPAx6pbQ7 NULL +56BMQS65YdOhgR NULL +V0w3pYUxg4Pe85bSga6 NULL +k6O2upxYCjQ1n NULL +40rIa7T1gy1eb4b7Ge2VDN NULL +5Jm0c0pa7 NULL +A36LkA3imTr2tB7b NULL +1x1vyb NULL +28131eU1pSKC35ADujoL NULL +7s6O45GD7p4ASq08a26v8 NULL +38TsU NULL +2Wn3m7QhneidkMX1q NULL +7kSfXX04U3 NULL +8yLnMOGxRK4e0Nff NULL +1V07gCB41Psbr5xtLiK4E NULL +U16wryUI NULL +Y8QG0P1v36K02sXHc84 NULL +RyE4Y3w2gXf NULL +4j16o2bV34xFa36 NULL +2VBb0ATBqIx4n1Gm7W8 NULL +xVIV6kFgqL8r1tcY37o0 NULL +467PTEoVhqi3kdYqdl6uT NULL +7Kp283Fa5 NULL +S21x1133h NULL +8v064ye21c NULL +271Q17NmKVPMlC NULL +CpJNPe416g82r NULL +8FpQRPC5B82ow502W46FQB NULL +ioU8KlM6LHCw4V86C NULL +5kiN628ldFC6 NULL +ai6nt5l5gCA3p71Q NULL +31m1d3P3AD NULL +My4DaO425f86c7 NULL +LCDBN0aaC17yk5kx8bq NULL +rs1jgr3QXsF803w3Eu NULL +fMHmD1111V5u4iBxLK8QV NULL +PLFB86o84end3tdsS2hVL NULL +M10C4DWJ0Gn NULL +1q3IAyF41KDbkoUH0UF8d NULL +yJ67FYA NULL +Nxy6uK6mWCk NULL +1D81pm8hqi640BbIhA NULL +2H8VG2l5e4H NULL +c0gO7g27mjW4XEaUK1fXvEk NULL +YRLL1E NULL +t3KT5K84 NULL +a NULL +bYcrtRvKkf28m64rY3q43 NULL +gwwQD5RH36V3t4buLdOyT NULL +t18Qu NULL +30S16Yv88FUQsDS2 NULL +5VexJO NULL +r75N0s4g8i2Nk3Olcl0sD NULL +OLq35YO3U NULL +NULL NULL +760H6 NULL +4HuS7f55wM87e NULL +X5pO0i1Yd6055F5FPNY NULL +F8iVJQQdC6O4 NULL +5UakrIuHrVadic8Y4C NULL +h5s74V3xB6SKD71q7tkjXlW NULL +t1Fb6vXsK NULL +rKJRy0v1t2MRedVl NULL +Pr48bUEafA4584KN30RanD6q NULL +6H2gys6m6qldIy4bENoFI NULL +JLB7v50LP4KVsH2or1ih8821 NULL +68k8JcLTRwf8X2P7nE4X NULL +RmHlM NULL +CbQNlJb76sx257 NULL +iWCNyh222 NULL +5WnxPBNK2ltE8V25WkKgr71 NULL +181O0OJ0P36g7g37vM2M6 NULL +3xN13QA1u4nP NULL +26xX874ghxkA8bV NULL +JPd15l3I6F4Na NULL +7Dl7rr2aa2bfovt1yny5v NULL +1Jq7kLUa3loRL NULL +1gE6P06R6Au NULL +BfGE56ef2ej NULL +hbHr0AGhP30hRfpMbI NULL +3abOQ1oI NULL +88dJOgqIlfUA411 NULL +2UTX78oBg574jiOyOy2 NULL +kceopv25c788XruGTA NULL +0dtVL5IFPf NULL +tPeYs504rtx4YRkf4MDyFg NULL +vcB3rQ NULL +6lqfp6xy7uLrK1oqee NULL +IpyrlcegF4443KoFVNX NULL +0iqrc5 NULL +ARECS NULL +wJcbJ NULL +myW247hI5iQQ4U37x5hK NULL +3d1IDSME4v0F0LJbBr NULL +57vi3IQLIES0Q16OTuiC4Hf7 NULL +FwMw41y68NnU0FGJ5k6 NULL +4JyvISV2yO32C16 NULL +RaVXc0k4i2X NULL +M3qqxj71FawLd2slbwTO0 NULL +BfJ4pWLp NULL +Xr1Lmw7g3730qA0N6n NULL +BxH575uxOuCE6sxn6frt NULL +8uc06Qq7RP2P1RAf NULL +l1Hdd044l045a NULL +cWKyPK NULL +xhAUptat NULL +0OD14f5eu NULL +2wRURKtw8 NULL +MK45RAOe4Ugk4UJ0B NULL +WYv3r54T7Ct4h607XnR NULL +S3cXoU7X01TxWJ NULL +MP277gwYLn NULL +SE70BON7C5PmaUdg NULL +IorWR NULL +0fjN1U4ogbI NULL +p014F NULL +2yd00UDPJUO37S4qfT0gHyg NULL +ladcLQv2Hj7mc NULL +wB06b612o55 NULL +0IX8xRUO NULL +0M6LCA6u038J33jdFuHfF0AS NULL +Eo3tUJICSn2 NULL +1I0750N5l6vsLXoySV NULL +64r6E NULL +Y6n3LVp5tIlVm3kc NULL +8F0hWV76XxO87NUJ7 NULL +NULL NULL +8s0kR1e4QVV7QO NULL +R4MT4f5U NULL +p568R4q2d3342ejH4 NULL +xH57Rg150gipl5F60IlE1 NULL +68ri6 NULL +Oyt670i0bysk650i2to NULL +BT3MW6yT0Dt NULL +EQT56g5A73m3j NULL +c4jN67LlOd5e0tc333TN0riL NULL +hLUON7y0c8wI04U NULL +jT4A7EfBJf5xjeP8x NULL +K3Ajb4l11HjWeEEnM02w NULL +e035q4Ba4721NL1l NULL +8TM0eO67oHDf3spTRmJ8k NULL +IRiw0v NULL +Y0P5Re5poIwn NULL +0jRGf5f1Q05O175 NULL +6D8Kub2t61I80E6Qe8VkYW NULL +vk2yV084Uf14ULLNJI NULL +5kX417RB64367vBw38XVJB44 NULL +scPuaL7lo NULL +X53h8r5nuFYOY3vop381283 NULL +bq2VE4s1Ps NULL +x365S NULL +fQUFR672Q0R0G2b6NVqx2m NULL +gj5IRDNe62057M NULL +h6pSh1A3WMOI3eY4IxD NULL +7a44BmyY6sULOArK1Jv65nnn NULL +6k775i02NM8tHyWkkUSbb8O NULL +7q0iMi2GDq0Q NULL +2OQAraVYMghEPUOfSU8YV3 NULL +h7AiQX2QT2Ch6A NULL +38Y7wt NULL +Q3k1H7E0N8B0vl22437 NULL +4ywtoYwxb NULL +kfUgQ2uGN8a NULL +vQ0a2oe83D2j36d375fkya NULL +HtI02nss6t8S0fqH4vcLkCD NULL +yOnsF4mFp NULL +r55X6tJ4eKvh NULL +y4M5U7WAv4eCCp7 NULL +We3CdnjxFCPE NULL +6a421YV NULL +m5fXVSdp238ETdj0x NULL +tN335oXx NULL +Ix8dXlDbC3S44L1FQJqpwa NULL +OTn0Dj2HiBi05Baq1Xt NULL +81ILAecf7Pp4 NULL +g2vI6MW2 NULL +Y55ytQtGRN8l58131e NULL +Y8q0gMXFDD4qo2nSC8 NULL +lo478ubT4XJFH825Os7H5 NULL +O1Kq8bfOEoDR NULL +aALrx8bSr75vWBR30H65X24X NULL +gv7hVe3 NULL +0JiVbqP3cG7I20UlHuc NULL +02vDyIVT752 NULL +ALpMVq8Q6P01w6 NULL +er5IUhd505r0lT6sc20Tef5q NULL +B40xYNyR664gLo NULL +16L335OgyOKH4565 NULL +RQU057I5Y544Pot NULL +uRcc7 NULL +W0rvA4H1xn0xMG4uk0 NULL +G2s1ly NULL +1T1oN5BQ NULL +dDf3se3j NULL +tIyd6H2oamr52OU50 NULL +l6M0m NULL +3G0hB0J4W5 NULL +qPe8qM44LO1G5 NULL +NULL NULL +wb5t2UC67jy84KejtAa0B3 NULL +l20vn2Awc NULL +us1gH35lcpND NULL +4FANhS2t7p58VJ NULL +PKyDxRfT7OOR370M1u64Gb4 NULL +Nmt6E360X6dpX58CR2 NULL +yh3ynbtGa0qwiMI NULL +8vohWoS NULL +nQ1I5X4X01qL8FyieiED0 NULL +j51d0i7u3KGhTKavw1C NULL +w7rU1B5g1v1Nkit7A2ruWT NULL +GHU6et8f3CY NULL +3PAm03r2we02Ye3xy NULL +n2d32Et NULL +k6p5qKPH NULL +Rf6HFx81J7abMFkh5l NULL +aEi5JQHQPd4Y8 NULL +2oIGN5REv78NrkB5Id2u NULL +B0bp3 NULL +22Yf3twSI62x1b1S7Lg6G NULL +8qhEui604mB8 NULL +43gX6s3LEYUcX668Ig5y NULL +PTl81NEYpvuKFBbxAOVh NULL +L04f4y3Lyo5r46mp2 NULL +vlxy2c2Igi NULL +7TSXOfbQHsNGLE NULL +40i6Qf07 NULL +PrKs7TD0B7kj847u56pce NULL +q0qMo2mPF NULL +r3See3oscOt3uwN NULL +Mk4tWJvwrb NULL +ie83eEmqsGF834r4COpw7j NULL +hS5Q54kmJc24T8um NULL +NGPH4Gm5Nq4e4Ub0D4S NULL +pAyF06b56PDyJ8PM NULL +v17CtBfRxKB NULL +ti12sx NULL +76URYL8H3 NULL +fNDP5n NULL +2488b5alBL0PX1 NULL +3W0GorVd6GStPF5S43 NULL +E4ekAO NULL +jxkVe1YhhX3 NULL +j60Kr2t1K NULL +5e8nU8q6vy6hcskp844R8Kt NULL +OgARV6n1iMYIW1VUm1ybG NULL +FWwENlTM6u NULL +cTWO4kFIrl1n NULL +1mop6Ft NULL +riW64mY710pF87mVeIh8 NULL +PNk062 NULL +8tVuiCkFtGW5KX NULL +5d346Sw21w4 NULL +JhS7I21kB6X43NB8U8 NULL +3JpLF0U3uFrIM NULL +M07G7IO4gFx1o NULL +Jj21024T2xdn6 NULL +1kFnQ8Xw3 NULL +CEIf818kp62v NULL +MpcgmXIn662H8 NULL +ySAfuiG2vJNn5TR5 NULL +78WeV1A4Fuo7mPSX NULL +kPC4VEoqGJthyOfD1r82GId NULL +54GiCgon04NXfnms6b5WRj3W NULL +sr70JNPff15hD1sl8D NULL +lg62eCuo58RSFPn5Va8va0vp NULL +1F1K4Rd NULL +JL7RPL2daChHQp7TY7 NULL +lb51aPvl6DbQ3xUpY1ce58 NULL +MCL83EIwhTq5L3clV2S1c8Q NULL +SIUKQ52i702FMVn5 NULL +6AGBVrkVMspguq568DHw8r5 NULL +khbfu5Ui5SQ88sCkT05Vq NULL +51ovN80JSnc7SrwD NULL +gjsL355dId0aH1mj0yGky1 NULL +6t557nSSrg1s0Q NULL +b NULL +jiqEpNs7qXo0y37 NULL +I884R85q1kn NULL +oa1p31X62jj14cJ4 NULL +So2K42KNS063nP0N1 NULL +fs2RNhI5c10lFG7O NULL +NOl00pk86Qix8KT3QA0pva NULL +X2NWPju6MGJ NULL +NABd3KhjjaVfcj2Q7SJ46 NULL +4kUFI473BsE2rgG NULL +46J0D1L5q4xsdl0 NULL +YJVDXD374nD NULL +P2o1Lq44s3 NULL +ojXL1edO7tE NULL +Y6net7wDJ2TVjq2u7H8aRCyA NULL +wonlgDe NULL +R7u871Dc73JF5 NULL +N2Jfon7dyCN2Pmm1JA NULL +CEGOy NULL +O35aM54x2F07Uq0f NULL +iKF22p74hKMcl6gypC8nqq NULL +X1cNlHRHJ5h6H8qs832 NULL +Ca1Tsx2aY1q NULL +Iwu3T706wKyBs33 NULL +4dogOB620W83nFvbfA3H5su NULL +QbGMK NULL +El5RUByTr1xve1tM NULL +YwV7DVLB0kut0S5p NULL +hrSdTD2Q05 NULL +ANpel663M NULL +5sQ4qB4ML02YI5Jo NULL +2X4Yj8B NULL +O745471yqQLem NULL +438Lxo541TwY5ID80cnR5 NULL +RlrTc NULL +8nwQ8LI1TiX30 NULL +4eFGE3dwF5 NULL +wUJ8J4 NULL +U76E6e5kOFi76knQwFHM NULL +75cBSvBTtog25E28v NULL +dIaRCgF47dy7ICv2EWJ4YN NULL +kXbBM1GFdKM NULL +I12pYjar NULL +4S44vF NULL +X5oShc74RP NULL +pERC8ns NULL +bvg7bP3mln3ILuC888M5DEF NULL +6i3yr5yS8g5fm8I NULL +QDuS4V7k07suxy3 NULL +bFmcKUp7iPlg0bAV1T NULL +S7ilpQTm4W0w NULL +EKl0r2F5MYb5ufApRh NULL +MP6mdTJr380 NULL +l4Hv30t3J7U NULL +3fT7I6UC6 NULL +FKDPbFp241 NULL +auGhMXSG3mUqnh NULL +au3q16lrAbWbHFqF NULL +uu20hX NULL +FM8CJ05Prlm NULL +41Uxbkbws7x1oN1M5I NULL +N3ieX NULL +AtJMWIQ0TN4v1Vrj1pHI NULL +7uEJE7MbCywRC46tr NULL +7d4b5KTsS62wJ NULL +7jtP3C204M33 NULL +NULL NULL +yRG7acYwS01a04X7XaW26B NULL +etHtCC NULL +8dDe31b5 NULL +5BO6u6 NULL +HkX7hlT2TK0Je7ersfx72o NULL +2Spj5Vq6Ngjb2dStLbFt7R NULL +Y5ls7N3Qy30h43866R3cL53 NULL +2Mwn2qTjLVk NULL +6X5JRqA20OBFr NULL +EN21f1 NULL +2dj7o NULL +03n0QGH NULL +KJeFD8m6cR26L NULL +n6n772vXEk2CI05PPWhN NULL +1DQ1RnVsCy NULL +6tH7O0gw0gJ NULL +EJPe8rNq3c5piv4 NULL +k3a17i1ndf NULL +8ev7c4JiIUUM5R8yV30 NULL +2T5u0u67tRE3Mm4Tvqdb8eL7 NULL +3Fhv1QY7Y776eQ38a NULL +24jbgb42dtP NULL +1N77rGXKwbO78axvICg8Gh8 NULL +J3HnM2C4sNnO NULL +8J5OB7K26PEV7kdbeHr3 NULL +C677g7qo071FQ4a NULL +0cg0haOcvRSlXg36n2k3k4 NULL +24IGcUngY NULL +ngUkOdOBOk67o3mcc NULL +72F3g4s43q208a2 NULL +D2s2711 NULL +1j80NSLbNMdIc2H3R01D703 NULL +He3002YAN1xWYJ5jVWaN NULL +qPiV0J6QDu NULL +0mokQ053qtj NULL +R426VY66G3alY1rISv8 NULL +VOE1mmY18b02ArowYML0bx NULL +7qAUegnj7P450rLp6 NULL +3DGKgMe5vV NULL +cre3m4OHF4H4x7nM NULL +M22umK0Q1S2Q80358P6 NULL +B553840U1H2b1M06l6N81 NULL +25l26587m1fsM43r NULL +YjyfU613tjGy NULL +1v6A2yY2i NULL +NOg4pvkcNV838CleFwsNLnOK NULL +5X8nN2cGsveSou53xnr1V NULL +8kq3a2DBcvac7BwtO4 NULL +MA2MxDjC0g1fxA0671 NULL +s26CNKKyFYtKdyb8tjVNOI4 NULL +77E8Xqg4LgN6ShBGOC4 NULL +pu2N7if4qfrnK5 NULL +IgMk407Y NULL +v0w25I0uVTf413Rar14 NULL +4yAo7t54rr50u6Vci3p NULL +2WKo5 NULL +lE7AE0Cm NULL +jfAN1XBVi5miU31 NULL +nqThW83 NULL +KnmtSR55J731b NULL +eoIG247 NULL +763gCfCExoaB1yJmP NULL +mnfiV3 NULL +40CP0hDas6g7m NULL +l8S5nFITuHXS5347 NULL +0HxgXxO8E4kP4pBLH8qH NULL +vtfmj6C3XmMgTOTw6Yii3Gl NULL +2d3tQdCGQN5k7u7S NULL +y4Slv86pFS NULL +tlH5St NULL +651R8MJPy8jvOnu3d NULL +NULL NULL +0uu4FunxNR7iOvw7NyH7mo NULL +yV8IBrXiawvrRqVkpmp111p NULL +B5ObAu54 NULL +btcI68W882 NULL +rqvN5KT0jA11w080At NULL +2taQsaEJVXuJ NULL +T8G173Q7r NULL +K05HlW2Kgr2Mdwr6 NULL +21k073eUyWivL NULL +6oAU0mBFKtwXOIAp7Yqi75H7 NULL +7Jg216IPQ2H7 NULL +frhe0 NULL +SN5NB5L3gpe2RtR2w50sNAd NULL +M7xB374ixGAp NULL +MxIVt NULL +2kechLGLtV1b2FK6h NULL +6fRvRXCD7GeBiEK2qfQC2Yf NULL +w0oRF7j8 NULL +A1g358aWFHPT06lWjso8OeQ NULL +5p73w4mBKifB5 NULL +d8p1NiE467oJer5eVW2DBi NULL +R70XMwQQS NULL +l1xK7L0L6TjOPrB1tc NULL +46Y3G8Rf12bRc7KcY NULL +i7n1eoq1Iw3r5q3qI3464 NULL +i0mx8w5HB8THd5N NULL +8k1748I2BIW53LK8dmc NULL +cUbphr2Or2aJQ0wNK3 NULL +U1aid52v NULL +o8v1574KSnXlsC NULL +hIpBJRGP12lL1QsnGUPa NULL +6G87V4 NULL +a0P3sn1ihxJCsTLDb NULL +lNka702Yt NULL +dOYnqgaXoJ1P3ERwxe5N7 NULL +k17Am8uPHWk02cEf1jet NULL +fqa4UONO5MWDc7865q NULL +g6VL0j3k7pEcBq0Hbsk NULL +ibHg41d7f NULL +WKH6j0Dtb3VNsOa4uFq2v NULL +O8YlG62p5C NULL +VbPmiEv5SDp NULL +pS3ybyjK58d8mK70GXa NULL +cR8uq5 NULL +7xh48cBvt34812U1at NULL +c06VUBp33f60n5jx3o1LWkpF NULL +M5MJdPI5Agcy5T NULL +u66PB1Uh NULL +rW58d3yGN1w3XhS7hx3UK1yF NULL +r8564D7t NULL +2a7V63IL7jK3o NULL +ann6ipj6 NULL +k7rg3Vw6IpwU6 NULL +pL11U1oq48Oj202Wy2W7B NULL +7CKu35ao6U121E3o NULL +S1Oect6pTauCf8OiYQTgQG0 NULL +KIXnc1tg5tx7JUmV14 NULL +6p53xRtJ NULL +Q22Upqia NULL +SeT3MaHfQ2 NULL +836DI5VY12j1Cd NULL +II1600yobW7p NULL +lR4VacVOx30bjMH NULL +L64VGc NULL +gOYmowua857xqiBSnM0 NULL +snSGGLkgC1Hlj8a6UKblKu4 NULL +LG13x2kvfvoJ5p4650xdQPo NULL +A74OqWUyE2kkH1o0Y NULL +E1pF32w3iVk3Q4E28 NULL +I3XOX0B0 NULL +7SND06C NULL +NULL NULL +B0As0723A520pE NULL +FjUt2ol81V3DS18I NULL +6SxF1xVO NULL +6atrHPq73d NULL +6s3xvhV71f7c6l0Y8 NULL +5qF06th6U7v2nLJ NULL +RYxq5 NULL +F63t6sNxS3C0yBtcHAUU8 NULL +MgMjEMssUEN1 NULL +xuX0OPw NULL +014ILGhXxNY7g02hl0Xw NULL +CdOTWH8E2E3POA1pghh NULL +fKbw64QavqgbDL2t60s NULL +M03632WBAO3Ot NULL +M3aR2541oGHpP2mTt0d68 NULL +VFxw08l NULL +8Bshk4eu870M3VyJ8c4D1upr NULL +b NULL +7kSDl NULL +rxy8A3l1WiycVA5c6Tl6c NULL +bQmm3Sk5f0ib NULL +Nh3E7W0Cb1 NULL +3H10xyM3GNP1 NULL +3EdQS NULL +GeuIPxcBXM3W70cSPfqC NULL +T6Al7d0hN770XB65M0F2g NULL +WAE3FjRSY77c NULL +e5YfpR NULL +O56QsHRU7FCsDRCX5Ay2 NULL +gjXv2q0AL7Pvi8hvW2041hJ NULL +UAJ47y03rc3gd04Apc NULL +6eeRVS85xD2q6Q8356 NULL +xlB1L NULL +5TVADgO1Sm3 NULL +Wf2j420jD275MyMlw2 NULL +OXHevCW4J150lO46s031n NULL +b44J5OuRTQmmQ8LSyy3EJWFC NULL +h78X8w3p3vmI04F8u NULL +w6173j NULL +o76L1vdV0 NULL +rss1vw14N NULL +IViYKd NULL +1gDXGG5x1D1v67 NULL +tdFP6MjN5b NULL +QuuIO6rBsRCOs7AcM2 NULL +3q00y4llsXx3Ao NULL +mE6lh4Kb1O5F8UQ NULL +fpgauY3B1 NULL +2sQ408i6h2V7MI7 NULL +7GeACqY0R NULL +h301kgvvRS1JMq4S8dl NULL +Nxd2HCv NULL +m80af4Xa6T3oR3 NULL +2T6W6I7vsKk3j6Jx6Shkq3 NULL +ADaW50SE6OE3Y NULL +WJ2kju5T4G65ckkpP NULL +jO055kB85qLIyl5VJVkj8 NULL +1H6wGP NULL +1V26wN5LmrcPV NULL +3afvyfFbo6GH6JS416cesO NULL +rC886ri07L4 NULL +6F8wR45s5ys8AkrBE17dn2oV NULL +wL170HpJ2nq3D4mt5X NULL +UR2F0Uwk6E5 NULL +5CbP5V2x14qPOqL3J NULL +T1CwC4PW8Q5GeXTK5CU NULL +H5alUwndRKm NULL +Qc8i8a3TFBT7M4tb1GFhH NULL +aGx8GQM1 NULL +sx0fwIg8cKq7pu NULL +NULL NULL +1RWm38Sn4LfJyr7341Mg NULL +yl7A1QkSCYHui8cwp4b1OW43 NULL +VqevY22vG478444ob4XCKnb NULL +3mM337C NULL +YwXWK0XCJ2kgubiO0Q2a NULL +LiFH6M60q NULL +nM5TO25VC7BK623 NULL +xr0YG03b6xG3oypsSFLkIS2 NULL +ve4Pgoehe6vhmYVLpP NULL +wQR0Ev NULL +2sF6Qdn5w5qO805cSaFV NULL +UDXHJf5 NULL +2h2qsp14cr NULL +f0QmOLoGtou7gq42fy01Brn NULL +YLh18Tir3Ga NULL +cp30v1 NULL +TNxkTGadB87QTkpe177 NULL +W0K88hHwlY6g5JNIeRT311G3 NULL +kCa0r7b43Pa NULL +7i7FJDchQc1 NULL +4s0J04m4B52 NULL +QDK4Rtj7CX01p NULL +GPijCx2T8HpOF1dN6 NULL +pyOqLGfATf NULL +hl4w6g0LGTr2q7740MWXNhi6 NULL +yc2pX4jTI0xKh5xTys NULL +K2Hjg3 NULL +bg6X4a4R5F6E NULL +R4H6pBoQyT2m6jMgObct1s1 NULL +NkytEWShAd84ojaKa7A NULL +DTJuXU1T0G13S0d18Al7XcR1 NULL +jctXbMJ5l4ypSx0SMGFSQtF NULL +jeOFkUX5u5flcN5hCr4 NULL +xefguKKDB5IsOAO4uv132 NULL +7SgB6fRom0PLEjCH1 NULL +6AmfdSoTPmVvXdgM8CP20sx NULL +43h32gpaBvB4T3elN4s NULL +g2E87 NULL +75OuwM0O3qDy NULL +kkHRoY7 NULL +UB3lDAw2A8A341Bv61iO6 NULL +QOev2x2w0723qyqs23d3k28 NULL +2sJpP82Tgm NULL +r3CkPpt24 NULL +5VVjy5IoG2Cu2GcdHEU72qsu NULL +8Q14Obe1sC82s2s10v44Pb NULL +VAv3o4ihQU0V87NMwfyg31 NULL +0FEc2M56c3aXrUw885 NULL +2QNVLQqPARH24r6rb4 NULL +j3Vya61f2BWk3H NULL +LxX7UfG58X6b2TTCwkEyp6 NULL +142dJq8N6LAR NULL +15cWEp2JVNf8 NULL +WQj6R NULL +C3s1RP5q7vW4B NULL +Sf45K8ueb68jp6s8 NULL +awXW5ct NULL +743510L4r5Npy NULL +jU6BuS50j NULL +hSb1x4 NULL +85s4lIu161r NULL +b0r8g21X6I2TvvPj623IKR NULL +vjtW5U2e1 NULL +cd6Xc861fDCGe NULL +wsjw1yv6JRN0y2R24 NULL +JPrU65giKMJpNd0611w4qcF NULL +5314P0Xu85GA60lJaVPd10 NULL +JUm3vwG65q33 NULL +7w4U48Dkch7l6d2sr3PpVP NULL +qlspyY30jeWkAcB1ptQ4co0 NULL +sr5s7Tu8 NULL +NULL NULL +H6UGGj6Bq4n0Dxr NULL +6lG12Lw NULL +033ffm5082ng0V NULL +FIVQ8 NULL +8m6012 NULL +0w0Kn7n NULL +ShA4jlmOwF8u7kjN NULL +ASm1a20I155Y NULL +64BdFi2c15JM5X17 NULL +8IkicjRJ21c054Id NULL +0Y77KBQmKC14u NULL +y6LhmEv NULL +pn1RqShxA031bNd NULL +2vXyUmN8p0lFrAjL1q3wOB6 NULL +570Sgf1L12mIrag2hICI51t NULL +Vk2Iv4mbULOS56roWfC3t8wE NULL +FU0S1qBBcs7T04 NULL +fXlXavWXcFSIIBpA0EFW NULL +1gdr1s14ckUm4h0A6Qj NULL +bh5xM4L38FqJEcT3A7l NULL +MegDovU0eCg3fkXrbtkH NULL +btgw707cKS2odwbePK2B NULL +6mQ6vL4d NULL +K11m3K43m5XFX40RJm1q NULL +2BFlmLpq7F1O6 NULL +lt17miwn NULL +16P2kxk NULL +26bLm8Ci6ebiJNpXa NULL +WBCaAb0o2Lsob4aiUHhvDx NULL +8E6m0haq3625pJ32EE NULL +5FD1Pq2Me0754jnw64jq68 NULL +758SskfjqM6DdFRN0a NULL +4R8agGBIHRA NULL +7e8cuG44 NULL +RFDIm4Is12 NULL +KJBwt NULL +5NM44RohO4r6 NULL +cgAGtv0pf0ob0MSVY1Tx3 NULL +2qYs0rStqVuO8Rg47 NULL +t2Hlw6483gjNM4UmOetl44 NULL +K7qIIaDS5myN14c0cJeiaW0U NULL +47kMyrkI1u51WS7y75pyy6S NULL +r1RYHxl1G1um8 NULL +QdHVkD7V11xI8fC NULL +V5u6EjQhsMFyr2vF NULL +eJyS37rSqP NULL +1f4h0JU667ht28ergbmQ42 NULL +lT8Wl2G0u4iHaM34aF75 NULL +u8vxgV6DeMarpPIoNRQK8555 NULL +iASE7cWnCT4NRf NULL +dF7kljY4Pc NULL +hR5oke50Iv54GVUI3AC7s2es NULL +y5G7HP4k4py873IEbQHFk NULL +UtFC8i5 NULL +H270yPJ55i1W NULL +7g83b3nl NULL +5ocI6aD NULL +L7n644820 NULL +50J08qKXC44G8HDMu7FF NULL +YXbTksK2YAt32i4vi6xyT2 NULL +bN0AFh0hT NULL +l6E3G8 NULL +xM1Gglkeqdcp2kE2v6ss5Cb NULL +Bgk2cxNJk7f4rMmW38Dl3S1 NULL +icCP7UDP0d1h5q NULL +S2m2y868yuWBh3T NULL +46uf5iNX NULL +nUyrKhXj4RG6e3c3nRpP2 NULL +ciiIP56o NULL +K5H5uc6M367aVUqW1QP72smC NULL +3AleqfnbvCOK755F NULL +NULL NULL +1VfAQ43G1EEip2 NULL +LP5AMypx5 NULL +5l4yXhHX0Y1jgmw4 NULL +bJQO0 NULL +GCAqH7rTc5Jt1Rie02v NULL +f5x7305T7Whj10BhLb5W NULL +KymYC73 NULL +34p208wH32 NULL +c34CVGK345 NULL +Hs1UjxW81 NULL +5nA54 NULL +fg7BpI NULL +716Tk0iWs7Y NULL +u41obQ17leqGpf7MTP3a NULL +370Iao42Ne47KoMuv7L0GKqE NULL +Bsi3VIb NULL +uo1oJ7l NULL +sOLhNq8p65eoW8e46X12WL NULL +P4shXtBlvn NULL +XqKG6hVEyI5D NULL +41A0nYX72UOSfxO4053xy NULL +a4F87eJ6H NULL +juAf7RsFm7v5rx87 NULL +N2h00u8 NULL +ytgaJW1Gvrkv5wFUJU2y1S NULL +5eNS6 NULL +Kst24 NULL +aK37I6N52tj0w32cgU5g NULL +b3T1L5u7us8 NULL +r5osh2m507Ot387emvDxNY NULL +7Xt47WK7fF0OYPUVU3Br2d7M NULL +10 NULL +wcBrVnjG NULL +lIcEK NULL +Bm8K5s1OHOM1YA65S NULL +1q6mOJMMOOaF1FraYJET8Y NULL +y2d583F10vH NULL +IUtkHTnBRV NULL +4QL5UDAU0u7 NULL +6F5nuSdvKK5ny2E7BF2j6 NULL +lEr1qTVVC1tC NULL +vJ7kfY8PEQ1qq NULL +42P7NX7gcwgOb727JtqNh NULL +5E1p5y1HXY82QUbObgeA NULL +ka4xX NULL +ldk1K NULL +T3qQxO7gFwJNh4Mb3 NULL +VugB74M4f31f0 NULL +4310N74Q4YtU2e NULL +N6Dh6XreCWb0aA4nmDnFOO NULL +fpt3gpLE NULL +2FBdToh5748vG3p1f4A2Koql NULL +XBTRwI0J NULL +ie3QYAuCo NULL +6KG7M5SbVWfA8J2wYvDbR NULL +6WRFtUnuF3scFWKkY4h782J NULL +V2NEmm6d0kLFGa5s01k NULL +g552y0x1B4n NULL +2W5VeOi75DI33He6HWk NULL +Mekui5MM6PUU06e NULL +x6ix2FeM883JI1Ppyj7CyE5l NULL +fwo2yaxByegAga0 NULL +6Weo4BXewS0 NULL +r7O5x3RuAB6v65VR2O71S3f3 NULL +7hCJ5yJvt0775jjgq8S0bX6W NULL +hhb12d5EV7 NULL +02k5poW73QsWM NULL +a7P5omBy NULL +A0A8SL0PuOtjj27670 NULL +xAkpE41B NULL +NULL NULL +GJm85Pul65cWoFKG4 NULL +7i03i80 NULL +225M5e1OeEOu7v NULL +Oxg1Ig1DBIXwwQv4u0 NULL +n3WIT2YtCj NULL +74w2cGm0 NULL +YUKS3r4spEtph1kg7 NULL +1mYj3F8wwhWgvemD5E NULL +7Fu3P11UxJJ101 NULL +vN0g7Ptk7aTyTIH1cCt2sX6B NULL +fFk28b88dvM NULL +Evy38C7jJH13gywu NULL +1tcrgsn5g NULL +t35FRs NULL +NkGnA NULL +E6EfhWpAlcoU2hr NULL +3Qm5PpAGbhf8NkWHJPv NULL +eF0N0Nk NULL +jL3mXoEuM0B NULL +5045L00 NULL +GDW1pK2834Y NULL +M45b3SlE5q5n NULL +u0N4kDl NULL +eicMhR0nJt12OH7IO2651bO NULL +bX48CaI1txU5AGn2AmEuKj NULL +ea23p2penJ5W5T4 NULL +e2m8waBVlVU NULL +o1q75 NULL +qAoGjP7q7r8p460I3aT5x7o NULL +f6kFn6sYs67ud2bx8eEsu2R NULL +8cjN6m1e NULL +6p0GBdNQ2l5m15T NULL +XSv8Ti8c NULL +j5QBwD36Ay5 NULL +nClXBWi0y0f664ah3 NULL +o6tgwEK05ls41D2fa NULL +6OdmC8H5 NULL +4W835c5Tu0aa4X2 NULL +IBVBmf6H8vCc4n NULL +8QWCbCQMIc3bsI7 NULL +B7P12uoI NULL +CeG187j NULL +5g8SC6Ol3gb0433c0B6 NULL +ijU4c NULL +DfTvU1F4hkNd5lJ4FGSe NULL +tOG5U NULL +B7grxpIo8Tf33RjGTg0 NULL +1j3rth56N41X17c1S NULL +NRXGu NULL +65mIi6OLkWrv1iSiM1wia NULL +H581dL8J4qjjb1DAPl NULL +0w036Qnm3WkA73cw142j1l NULL +QRQRpg NULL +yAl0UQdXg0 NULL +Vk0CBX0oP NULL +5O4amH0XK1mu8716 NULL +6K78X NULL +DBdP640m2jjC NULL +OEfPnHnIYueoup NULL +vkYPoDV5YkBk NULL +883d6jHJd20KHEEu0R1Kx41 NULL +esc3k10A074II2a6h45 NULL +M70kEecXx1706B NULL +1e3i0H8MvWpar7 NULL +RE6h44gEq6x0Eey NULL +H8PP4887 NULL +q4W4dHaEO NULL +yV5HBS801PWuBhy NULL +H1v2G NULL +mXUG4lHU NULL +3rDE5ohocdMweTS7gspnT3 NULL +NULL NULL +g8d0MGKWIe2r6wivyyl NULL +w1SmT84We3W7V8ft NULL +0rdrrU461v NULL +ET3d4F2I4lV NULL +5QLs0LVK1g NULL +7wH3hBKdO55Xq3gEEe0 NULL +28Oe6r21yux7Lk47 NULL +xTlDv24JYv4s NULL +1B3WMD5LSk65B2Moa NULL +pM6Gt05s1YJeii NULL +meGb5 NULL +mby00c NULL +LSJtFA66 NULL +nI30tm7U55O0gI NULL +KHtD2A2hp6OjFgS73gdgE NULL +eQ80MW0h728I204P87YXc NULL +d3o1712a03n20qvi62U7 NULL +iS4P5128HY44wa 3890.0 +lJ63qx87BLmdMfa 11619.0 +bUYKB511 2175.0 +214UsrYtB1W4GJ -11995.0 +Vpsyy3y3607I45wt80mt8v 5012.0 +A6M1di6LUH -6786.0 +Y23NbD7X86FbcRP4 9835.0 +25umK0M57MLXesxE -4121.0 +Ovk06Dok3I -6622.0 +Wl0MOM1F2J -15244.0 +a -2944.0 +God464085G8vN -14721.0 +IbCc6D7WIC -1878.0 +pqI1n3A3 4163.0 +ijeMq4LXB5UJ4Q27LsX -10829.0 +nYK5s12fK544K 3702.0 +y06g1fAJWh6nWkM7 8951.0 +DKu7H1t4Xp7x -2991.0 +S45x7dofb8hIodJ4e7bV5P 11550.0 +h16y0qg -2527.0 +2UXtO8TI7g3MluJ 2326.0 +3kXN3Q24nA206Le -12797.0 +l05BrY7N50522rPw7i78X5B 12176.0 +iSWa0uvV1O16A3H -31.0 +Wn8q3duQ4MX1jn0v12OqaX 13851.0 +8411i6 11431.0 +nh2k85JcV054IH -12937.0 +bFurgD38OUb87f16I21 13271.0 +dR3U7vP8MB1pmRmoumgi 9687.0 +wkgvVMn7Xf 6787.0 +5j3588UoxeUDcD4tg5vH75W6 -13400.0 +D40tyXI -12040.0 +a1PD7 5802.0 +N16sP2YTPvJFPcoCDlg86Qv -7091.0 +f7oB3Nx8 4660.0 +MO262WPPSYSVGe6X -6694.0 +il3l6en5b3J 2535.0 +mq1pO3MxhA5UqXh 9728.0 +tbT14Ok7O3 12744.0 +PGx2v0c7M8w32y2lANR0 -14868.0 +Fe5nVb0 -6529.0 +JjSn7CL7q0 16160.0 +XU13On4 13517.0 +sq301oxBJAfWx3ldfvFs1dF3 -8129.0 +66d0I3bc84i67ItF682yp 8869.0 +AaE3g 4708.0 +n5UFX 2446.0 +1q2P1wSl82q13 9993.0 +h522G 10700.0 +EWh0x08 15540.0 +Q175gcO2v35jI7s1ApR1 -5994.0 +LaONIKN 13704.0 +l4bG0h7NKXsVcCy 11951.0 +xQru6kqg86kWY4J4g01 8896.0 +bHf404 15823.0 +jx283f1Jyh8uUy0VH4g48n7 -11695.0 +ol6KFpp67So1KEp 8521.0 +C03MjgFY8ye3 14798.0 +F8D816El20x4myKT1dtjX 12178.0 +7e8m5J774M2W 4520.0 +6LrxCc20102P10n -13843.0 +gu1GY0 -2481.0 +6a31r6b28cEO50W 14936.0 +7MJd7FQgF0U2O -9305.0 +73xdw4X NULL +sb0E3X -8360.0 +cAULCRDJ -246.0 +V0aUb2c8h6sjlr1EaX5 1997.0 +u8CCBF5LeG68AYE5OoBk6 16160.0 +snx0x -5482.0 +lMeMO 7248.0 +APvOgiDChph5N 10569.0 +xE2U0f1ScMW3m5l -3257.0 +7y06q4eHWy 8645.0 +VhrdQM4gb5 -12453.0 +Df13qWE -6807.0 +pYC01XWbNcD 2081.0 +P25oSI6FYWWQ 6320.0 +n73270Yc5c -13672.0 +0ruyd6Y50JpdGRf6HqD -741.0 +sOdj1Tmvbl03f -16269.0 +oi8Ci6j3bY6b417nURA -11546.0 +Erx54avV3Muo -5892.0 +10Hr5oB07Ohu0622u 2261.0 +2m58rF 16331.0 +yRQG17c7xf7N75i622qi57 -10675.0 +8o32V0Pboeu66dD -15193.0 +775e0LbXs7vkg3j8QSEnc 8979.0 +6Qjs3Ih3xykeT0 -9034.0 +E5ud7eWss5yUDB6657GIS -10688.0 +46X778w0r1Ueuv052rvegFJi 13332.0 +D58FB1lUvSdKjxDqXeE17j8 979.0 +t1ex1HCO2Wbl2X4 -7700.0 +y0Ea1fx1gS -15283.0 +u1UO5pDjJun0Th 3466.0 +5xVb76eiua8 -3668.0 +71Jt3gli42yRhyWk0 -4574.0 +xf1y2WfXYQJ772QYXBH866y -5550.0 +8Eop5f14qyd5QAN4v0sR8 11054.0 +2fM8qRJm8x3SkFAvM75 -7717.0 +uk3LO061q 3251.0 +7Nu0NxOnHSsecxU56XQbJR -11542.0 +kx8M55yd88Iu5Hs0 -15018.0 +0yVT3lMBd8sp536d 3496.0 +p2806PCk5oA1q3Y5 6290.0 +781UTqpT6gVs6WA8 -9471.0 +MYCu0Tp74VhvcT7fg1dTyG -14746.0 +v1H2G -3213.0 +6sv3ND7cm7oj62dW5A8ms 183.0 +f4K7sWDgJQ1uemjKGDw4wo1 7178.0 +5wf4DOCHD2jarRA76GQ6dX2 -15010.0 +V2pd46En 2923.0 +76dOOD7kG6dtWnpBjR8 15284.0 +3meYy6xhwQL4817A3UM 3978.0 +p05dhlAsk 2432.0 +uN2i0aJe27Js -11503.0 +5K0nRX6VFCm 9725.0 +16XJOPr281TmT72Y7xqB 11166.0 +08k7WHcnY6K3XyNyK21IaE -1487.0 +O5RI7q7e 9289.0 +14V5RTX2R1 -9601.0 +w0DQUy50WiL3x37FO0V3BUsD -948.0 +6R6Mcd8hW -14076.0 +86CWKiqv -11209.0 +327LJ26mRqM 9182.0 +4Pu62 12205.0 +VPkNqEMA7Jg1x 13555.0 +57156tYxJ163 9759.0 +g5IWA5kuuD7uqD6e -11179.0 +4O84Y581OK0x7sYP5Qvd 6719.0 +yS2J6L4Cf8O6Y81 -7519.0 +GdC5XV8b522xytD -14257.0 +XKb3MvO6I8a656xQv2ikTV 7803.0 +pg6MXmv06w1IPinrVuLU6qWI -12558.0 +8x33aIF0uGR -14268.0 +sBHsdy4B24r8hd 4520.0 +32v414p63Jv1B4tO1xy NULL +sep3FAX3p4Ft34G037ea5486 -7453.0 +pErR0QHn1 15845.0 +77jNF 2306.0 +yrE65msP50 8575.0 +XNho43uPjWG6c5bH8g122l6 4888.0 +7YdpF7T2 -8350.0 +2x58ER5s73ga5cx8U17K 14541.0 +KUih81wokgXk -12874.0 +H1wKsxw3t00r7 9040.0 +Fb2W1r24opqN8m6571p -16300.0 +Jk72xErx1U6M2x0B4W56 -1009.0 +T712Py4Bg5in472VXtSC 4016.0 +5ryBb3VcnJhasRP45 13810.0 +AU1Wbf 5617.0 +t10Jr42A1E5oNRgo16XxF8Y -9287.0 +RD6GIHDtJFX4481 -8703.0 +7axyXd55ji4n -1865.0 +NH35LOhV6MoyA6t0bXl2T 6010.0 +WaK84Y0Qn4HE1V0SH8akT3j 14909.0 +5dSXoPq2rsu2WRNG5T2WDLgQ 14355.0 +G8Yan 10141.0 +2v8x2Nmr15 -13427.0 +vHmH8uLxnn3 -12214.0 +5001TmV0w 8704.0 +qWjiN8uWg1n -173.0 +rwwp4SB -13597.0 +C60KTh -7433.0 +0AKcTvbG7 4608.0 +20AgBx22737wF7TvGJT8xdV 5253.0 +s6n22rdHY487BFAlaRsk 2020.0 +lTw7Vljq -7889.0 +habBG0aDt3MJeAL6 -4420.0 +SqOW5p2JiWtBn3 6383.0 +fwgu11vt0371iw6 -13669.0 +712Lg15d315FxK18hTxLG -10966.0 +20761P12SQ04f8374 -6726.0 +VBVp7N -2265.0 +5yLXtQjDD -8520.0 +0p7sCjwPHtR5u1 8532.0 +yNYJ2XnFfEyU685iX4 11363.0 +71X501p38PuQ41j -11125.0 +N1MDwf 3567.0 +Y8WfaAvW6 4224.0 +GJdBrSK3oAPYg6JhqnY0Dp -7016.0 +xAW24OW0425wJ -15817.0 +5f20hgbl5yG38L15f4m -12160.0 +OKFeq 1851.0 +2YJVQFBo3T2Foy43GcA -238.0 +kHAYmWhm 5153.0 +ueiE5Cce86fi4C03t58 2100.0 +6A176GMq3e 720.0 +31nyhCE127sfC8qNGr6X -11353.0 +C61uNfErrDn42 11667.0 +vTIHRwafwXD8mj52 -13377.0 +HNeY04c4q5MRO524OG34 -7892.0 +SQo81Uq6IwK035 -6097.0 +PT3jjlj8SP67iLnF7p5nW -8924.0 +um7lO2KS8xNe6dpx1Cm -3623.0 +7cyjB646NeRKiJ2 14015.0 +0onk8EVH -13154.0 +64Voa783jTa3gYtxdseMb7 15867.0 +m0Tg0IMe4rI 8269.0 +aC14b1kcXO 15284.0 +5ii2578DCFrCPlxlw1qa3p 15424.0 +g8my0HUWRfpYm65D85r 12553.0 +U2KLqT2 7242.0 +6PO0RC7kcbOd -13366.0 +2UY1jX2B1xNeR5h1qnw3 10967.0 +4W87PCaousB -7002.0 +cnlMCD66T2Yyf42RG4Gv08 12929.0 +jmJMmlHuyJDg8fPmF7v88N0V 15199.0 +p0L6EI7X5jX66cV 16141.0 +qqbDw46IgGds4 NULL +7CN6Umbd77shwU0vM40 9480.0 +bBAKio7bAmQq7vIlsc8H14a 1949.0 +nyMprPO 15099.0 +722i4VcO4A373 -11092.0 +5u03Le2wIj -16030.0 +6U73ihbtbGkqB -18.0 +5o8dPu1J5lPI0 -1640.0 +ilM1UO8k4hDR4ERgh102530 13948.0 +2s3N5qbQ4pPGcwC0L6q 12507.0 +Dpx32r5sd2v4Q5rAo64T 14574.0 +758jnDonq2KPB3 12070.0 +WJ1r723bTaKv3WE1ujD 13124.0 +a4ncnCrCg3 9941.0 +1HF15l 5144.0 +JSjAUy 11259.0 +14aO58n -13672.0 +cCaJdJUbsd4Su8F -10736.0 +T77vl5bqL -7980.0 +QujrLX8h1cDf3QaCFF1 8812.0 +iIs0Lb6 -10789.0 +ntgU0vf635 -556.0 +7H4jdc4mIdrlM832TaQVvclh -8326.0 +DHsQn6ygx86F 15555.0 +x4Hx22rY8 6005.0 +6r452KVx -11662.0 +UpgW013RlYKu1NusJDW 14724.0 +Eg14uIJR0L4A0 1609.0 +8fILes -4357.0 +2GN33486Eatu7tJi2832NSx5 2613.0 +Uuskn6Pny0Op4J3T1 -115.0 +fX2DVO612 492.0 +i2WiP -5093.0 +b 2401.0 +WJ4Y31ONd2 9323.0 +bvPndT2Y5m61D0CKug0t3 -2431.0 +vl31hFdNGwaI 5417.0 +245ELjN84 -8098.0 +EIDkp -5418.0 +14UXn3xvdW88b -4029.0 +t7a5Mf1 -12409.0 +8uWu7hh467KSMsxmX68 12608.0 +86D3lv -2230.0 +L057p1HPpJsmA3a -9542.0 +3fHq6hA2VAdj4gO13MJTE -3553.0 +lthwVA3Axe08y4365k18E 4213.0 +J67TT5A 8218.0 +16f7lbK5unxiEgoLr73 -369.0 +538e1Ht8T4tNdGJa5 2930.0 +E4Gnt5L5lB4cej2WU7 6976.0 +8u8tR858jC01y8Ft66nYRnb6 6454.0 +047Nh03HwK -6789.0 +31u8TV1q3hv2kNyJP -10664.0 +PK1Ato 10520.0 +5cEU055y5C -5088.0 +rYuS0RHMC1oeV01Bhbc7 -5016.0 +b4R0JR2yv3Gk30228 10887.0 +Bu4Dn5U0tvu 7474.0 +6NGoA77CWv035qcLG8O 2068.0 +w2vAlg 4842.0 +eh85P0V0g -1841.0 +Holgr1pin 14557.0 +KAbJb 5609.0 +cBKNq4fPymUw1KeEAEf1dw77 -14457.0 +sJxX6 3594.0 +G8kGyEK0wjdLTlpJp33Jds 15918.0 +4e1D6b2moaJ2LPJ70u 7988.0 +voB0wFAf7H2PvUe180Gkj710 9365.0 +SbaXC0mXWAJCc 1294.0 +gcjQDkje3H2N -7398.0 +p05ka6Ru7W7C0llJ00h -15101.0 +3080Y5smP4JT6 -9841.0 +713lDu43 -704.0 +uN803aW NULL +pc0F7 -14270.0 +N0wAwpxkrbl81WRj4 105.0 +Mp0srA26pW81q335754k00 6900.0 +KW3ODiKfbW3fS03W625w0 -1050.0 +46tDHL8 -3704.0 +D65SRo -15775.0 +08R5I 8115.0 +NiIO5P7b67gyBUw7W4XMpsRh -10483.0 +Bw430F8581 -13742.0 +EkPP1 -12127.0 +VWD2O2vD -10084.0 +6D82psrBv0Hi07o -10879.0 +1Tr66A4C6WsuK 2570.0 +X4mk605REMUcE -14302.0 +kDX7S 3221.0 +b2Xcl8MXhcs7x3KOV -9078.0 +n2sI6UK8WGw75g -6403.0 +3E1n5Vbvp 4554.0 +qs15562E0jiXE -4546.0 +3X0nrU -14933.0 +oXtkIGnci6hCN3N -11137.0 +km4PDRVahu7Sf4 -3873.0 +S8b1BRKPK4cTM3nbaI 7265.0 +2cla1Q3o3E8H2 -7768.0 +KQsF81TFt 1591.0 +I5Bn3UVGU8LFd2kl2 -15423.0 +0HTm73B 2533.0 +C5gxw26dt75 -659.0 +0DWYRJMc8q8DX2ltX0442 -5568.0 +05B0hwk3h12Vv5nOO07WfR -1136.0 +NC7F5u31 12800.0 +e45JkEc41VGF88lgenm 3844.0 +vW36C22KS75R 8390.0 +6y204sjgbO 7751.0 +cklLRY5lqR5bojRXCTaAFg 10015.0 +U6h7bMr4OGIrgb -14494.0 +Ga0dkV -8682.0 +03Kvh3FL1P5FN0BY37kHpH 1307.0 +s6188idH -13380.0 +ww5H32r483cI -14712.0 +Ee5lLQ15D4SLNmBo2 -6673.0 +b253HskJLFwL5nahVGVE 9859.0 +6aOBGB8OUjUW -5920.0 +J64y0E31kLxdtx -6544.0 +Y1xGi7I0CLTWr0D 2162.0 +1jDB0 -8984.0 +lXhthv3GoliXESKJV703 10880.0 +dFhWoN8nr0oDs -4866.0 +yRp5TO3KF0jG0L65s12 6747.0 +8w25qduHs0MI5K33SGY3 -1666.0 +k25g01AY6CJO 12471.0 +xL7AcG 2376.0 +8ddUotw 6113.0 +77U1exR00smD242q6fs8sv2 343.0 +SBjl520125icn82UXE601mFn 15704.0 +hFV4Y46 -651.0 +x4LAd835KaljPah2WG3 11470.0 +7NgRlBPxMo4 -6156.0 +MDHRWctP3rjjvG0eio7SJ -1316.0 +kXk5i4iD4GuhDA4e5FCojf 7677.0 +87rDPuuSqyt2M7j16nOitai 559.0 +8jjmTVU3rT -12665.0 +pTEY0 3580.0 +5MU66wbAk41JUMg0055Nlv 14841.0 +ao2occ3M3dN0rNOufKa57uuu -10748.0 +u1M04h412 15690.0 +7sm5h 2589.0 +h5ptNc6T0l75uWGi2VW -228.0 +y22uYe4fE 11130.0 +5MLQj 15884.0 +w8Y88t8r3sRV -5227.0 +vmAT10eeE47fgH20pLi NULL +HR8x5tq1Wv25njjUXp 9071.0 +42r63DM4K 2734.0 +kLIB2cKNpj05875X6jq534 -4120.0 +4s1k1B653oP -4657.0 +UHU8rd3IJ8Ne8A -2360.0 +UnBWlD3B -5503.0 +2F8b4jJ1722A2Pxu 2943.0 +q466e 10581.0 +CmX7o -1343.0 +Jsnr2nIA 1574.0 +6K4d0il -4600.0 +04x2PT7M1favj -11511.0 +FQ2113IMyn -14790.0 +CN30RbmhOI5ipQ6x47ca5gK -8068.0 +5M28dJ734D7fDRWCQbOnb6 -6157.0 +QYW7H8ta63kcfM 4434.0 +T3UqJ0 318.0 +jENe6I6 -3287.0 +W3O305wOGjyH2l0f 13248.0 +1kcFiFLMrMi1rhHn 8144.0 +86S3F 15786.0 +x4a23Dor8e7Q1 8529.0 +pw8w7u5MLd3Ha6DBWQo3 5080.0 +dHC8If3liFqC -15460.0 +NVrYp75d3laTb3Ii1a4m0j -1869.0 +3x7Jjk 10034.0 +LFo3Ls -15303.0 +y4dD7An4nRX32DI7aXM3D5JI -6906.0 +Xf1MhqkA5n6 8058.0 +r670GY0N4E6UGSDB4ol7Dq -11227.0 +1vMvKTO0AI5XSa3F1DYNp6 -14432.0 +nlv0RAH77mrbG6FMSDi5 -6843.0 +x30G13771MM0tJ8105AI 3436.0 +5042V -11029.0 +38Y2u -5884.0 +lwuHF60C0 185.0 +7noHlf7x0E4t 1145.0 +m8fgjAecRf48aP -7285.0 +LO0cOvQAgidX -11596.0 +yi8rqTW8DO5Iw3NDr 12526.0 +DrXH5D4L1gTCAqG 1531.0 +di55PD6eD 4619.0 +G8l7gR7rrC80rk -12861.0 +7ShU45Cr6l8 7369.0 +TGM2pgsoNL0kVVPrBM2 -867.0 +AmSQty0F5Y 4421.0 +rGJLrICBysq22k6lpYsrm -124.0 +S7UM6KgdxTofi6rwXBFa2a 12520.0 +BD5BG4 11612.0 +e3st3MhTgljOA8h1THm2 -12874.0 +3uU325ocmMi8PM2hP -5765.0 +246uQD3RQ50gYIC 4102.0 +Q86x37 5270.0 +h2Q4cPeN8N81eVRhLb -15016.0 +5ON517IeD8XDLAhh 6828.0 +144eST755Fvf6nLi74SK 10541.0 +mGh7j44lxhB32EYxn7 -4665.0 +pkEQL6B3rqUA6Lq -9163.0 +sGAxHJ1k350CxuW6 10824.0 +ElhqquN7n 2571.0 +4j8sceYx6vwS3L 15871.0 +c6oaqf0P6yLPl 15524.0 +Et733lj33Gg5S0ET3 -3435.0 +opJPcNicoHQC6XEm -578.0 +4hyAJ1G3u61 -1184.0 +TNva0R8 3463.0 +AH6e820tOV6HSThd30w 867.0 +oes65W6d3na8IbQh0jnN -9057.0 +st73jSGkw03I -10976.0 +CV6cC5cYQ7Ybki12sokm5Mb -12375.0 +w4a3ct -15373.0 +qEnAcc0d104j 12314.0 +tFY2ng51v NULL +JJIVc80Pgv 16242.0 +Fg05tGcQqI78e4cgDn538v -9151.0 +6O1S46uxV -12163.0 +wKOUecPgo2II5Lg015 10074.0 +yf0LoKB6NITUNpA 9339.0 +lPVM4Hxpb -6691.0 +UyJQsLguJo -12517.0 +7rV220ruFc6Y3LhE0 -6969.0 +t6i57Lb -4579.0 +11R5e0X4LOeDU3kGt 8848.0 +k4W4gs0NL50 -739.0 +e542YmP0Fu1hw25eP263UA 9436.0 +vHv6dd0pdYeE21y -11343.0 +xmG2iGNF6M6oc -12602.0 +gA0M8GmMH6TcQCGdQi40Mj -16109.0 +nA8bdtWfPPQyP2hL5 -16307.0 +U4o3sWAqLydj0y -11929.0 +58Vl5WFf8p -5241.0 +0Pgnxt8CrtOEWy 348.0 +y7C1f6277MNre4kv -9532.0 +7bv4R8 9296.0 +24t2xP3S 9692.0 +UeKB2Tf 12983.0 +orlgoEeyBMj56nf30c -12026.0 +37DtsTbag75dgC -8643.0 +d55pP6gPa2Opv0B05C7LoX -6422.0 +x0JhWPrCmV0Vr2Ss8BO 4411.0 +7SVXqa1T1 -2011.0 +7ru0ySl7vhRybOK17h2I637 15542.0 +38vX8Oyvme 6867.0 +368K1rQxOIUGl7 16253.0 +g2i0JT65x 10658.0 +pkx6Ce4rM6PyWw4q1T 6362.0 +230qXv8c48waG1R6CHr 15902.0 +Qi73PEPD3E -12695.0 +3DE7EQo4KyT0hS -16274.0 +f74WL82kGAkHoFCYuHu 1564.0 +hAd5Sr6Iosm0 -3128.0 +B2pg4xQ01oKud01 7327.0 +0UcJbaN8 -14789.0 +c4pp20 10105.0 +EJval1Oc0x27mdpL1Y 2320.0 +BDw128DPSapP0X0 -6109.0 +IJxBli -1351.0 +70X2iduWv1bEM21785FOdY6 -12203.0 +HXUyE4BVO5tji6 -7307.0 +10 10419.0 +655LE2hp0lh -11155.0 +4gBPJa 13167.0 +Sn4Y23KEE20LV -5612.0 +rNLf85aEj3p4HL3x4o -10295.0 +4QG23O2GKF6BUe13O7A2C 10.0 +Tt484a 754.0 +8hh0tf6iia8rV -9861.0 +2w7HaRyy7SDnxGIdgT7s6 8970.0 +wVq06T0QJ -836.0 +4If8MQc4 -7677.0 +rTCHTPRk1t6A2sLxwQVY -6109.0 +3UM32OYoBAub4rQs8tdq8 -11270.0 +5i7MvTNnSmh5nvP0kj 11532.0 +5L4I0gIg7R5fM7 8412.0 +cC0aTA226U0YLJm2CX1m -14509.0 +Lg53Ftt6PwHEMDk0Y 6457.0 +80U275bv -9664.0 +y4AB7n55M6 16280.0 +qMwK6G8LtMjckxLtwUj5YL -2314.0 +2U06fQ 10101.0 +hoH5fhBc08 11825.0 +k17fi8UPMMVVgLf4 -14213.0 +ExWpHq2H5O0nP -3977.0 +bjQP6L 8401.0 +fo617 -7315.0 +h4omSc1jcLLwW NULL +ki4pfORasIn14cM2G -3802.0 +4V2osM67mkXG 15586.0 +q7R00045lYjcd -11216.0 +uP86Gk44hMQJd -10390.0 +ssv6iCQ7Gt7CI7j2Ks850elJ 10221.0 +NOCfvcKS -16184.0 +4Y8NFk7mqmC3 8738.0 +8QcNg01GEF 9557.0 +XD4Ss -7980.0 +T8764UNruF67h3 3720.0 +8xFru -12742.0 +w0cH16P44K2bo4grtgoOyEM -1370.0 +8YHG1 4661.0 +88FnP7ihMB4f88TJN278CT -12181.0 +PG47iVjL87G6kcT -12207.0 +Hj3R632OuQwd0r -10014.0 +bXrHpJ1X -7072.0 +RGHO7206v2aR2 -14208.0 +hrO0S0XuD1W4 9570.0 +nq1ILBd14E500xFU2 -1268.0 +g5v0R16ha6eI -249.0 +7GFyG3 12402.0 +hpB4Tn5E7507P -5517.0 +23tv5Q87XXL2JRhI6D 1964.0 +JxI8vHvRp2qUEeHIFB 3259.0 +pdB7luDrJ3h 10206.0 +5OOnLN015tAyeCnl6 10183.0 +33mc66c 11377.0 +V0O4tCF2N -15167.0 +sje1ye6Rxc7EwagkaD2OOT7 -10197.0 +NfuN3581n 2139.0 +3fPay5Or38giJylBUGwW 11428.0 +1T15H6MJi81crs35pDY8p4 -6222.0 +PMoJ1NvQoAm5a 539.0 +7r1Q4v63c47B -7493.0 +DCDvH0Ro1C -5750.0 +14q6lr0573yWa7u -14134.0 +q2gwWd 3806.0 +8pRkOXod8QLx2jax3AxJ 1308.0 +8B1e0uEbua066H8dUrR742 -1364.0 +5Nxj5JxuW -534.0 +006bb3K -14946.0 +81teE8XJM6 -5470.0 +Yp6VJPVqnDR0fHkl 11500.0 +H25ywXWg5J 14398.0 +08c0T6WJ7gREGr4 -1468.0 +dPPDUuv2ISw501i2p 4246.0 +IeE7W6eniofdN 14746.0 +b5SoK8 -16306.0 +odY5iv24W -995.0 +jm8IPbGLc -575.0 +10ljXCFT6fG6Qi3S7414e -7238.0 +12njwnswv3XcLx0a30tnc 6079.0 +M31sGqF45Ub0oR0hq2 3628.0 +05XlEbko5Dd31Yw87y7V 4274.0 +2L8uS24vDmMefb6XqR85U4C -1902.0 +l7tR3qF46ej7i4uNNuT -5701.0 +7G06EQdECMJ7l1oW 8333.0 +hV0A77g6ThTl1 -5865.0 +6dGA0 7876.0 +xsnfN46Yj35c0v4n -2575.0 +U5C75sQhdB0 -15915.0 +32Q066E 10896.0 +10dUdwyXp5XwgpkTxLffmv3x 4767.0 +385cyYam0b0nAF717o -1469.0 +1VtwojBM48g0 4525.0 +Ahnqoop12M16YT -7967.0 +0j0P462my2xp8vCY2Oh8s6rn -8256.0 +o8BJbkeG3228 13500.0 +wR57mq -2595.0 +O87k6FTgfM5A 8297.0 +u5C7glqT5XqtO0JE2686lk1 NULL +Ox3HlDd245 -10805.0 +24Xq1VVJ -10379.0 +vD1G3Nt7U24 10268.0 +6175g1QUr6 -8869.0 +n4e3S2Uj7FoabLb 13297.0 +Y6d74Lf1ji3v 9661.0 +LBaRLg3 -6204.0 +w5p2hepgTqRaL2ELCl 14826.0 +MQ1rdDUFVb2Ek -4449.0 +7NSlm -3722.0 +sMPaQ6gPAHp05 -10477.0 +BfW7r -8346.0 +eCd2BHx36NE3eVQQX7YO2c 16092.0 +60NH2a6SQ15c48rbXckK5k8 14815.0 +hM4h8a4aXwJP1127xAC -9863.0 +2q3K4S2rTX7K2by4c7H2 5539.0 +sRY8V5YDK4MvY 10852.0 +F65r0poAe2 -731.0 +2Q18K28dIIL 12578.0 +cNav7FGYOHd3EUXMS 4943.0 +bo54OxoS6UHe605B4L 8833.0 +c8b3TkeXYCq0fvRes62t5H -13174.0 +u67X1Fjm 6348.0 +0J1T41Nj0r72 -640.0 +Hlf2S88w -8322.0 +AFhn1et6NTnUO3F81D1i -5524.0 +hn35LQWu0t6 15647.0 +dTTnUqcnmXBBIU1YN01b -8250.0 +f2i6luEMKiT1KnRPTat40mX 10994.0 +bp2buWAbX7JBQHLuun 11657.0 +VXXGafnyn1mkpSpsOd8 5989.0 +vhShnBOOp21xkeFC -13204.0 +0b3rr -8534.0 +aicQ513r2FtX2 7654.0 +ur4i65Ehv8Yr -15390.0 +f64ukp86atDBYWH5eW 12866.0 +R65wU -13060.0 +4xgO0kF44085iT4b0p65E 2596.0 +P5PT4r2Syq367 -1767.0 +2svmgiXe6 3972.0 +lM4ehyd -1117.0 +C30EryLS -6.0 +LqgNlmnG1ygCm04278Yv -4817.0 +0qPPiSO4o5ar2J7Cml -5369.0 +XJk8krRPmgi7Le3a4t2X -12100.0 +7r8qT5PoU0hvo5wVvwMwR3 13317.0 +G8prSshTWnX1Aj4K -9451.0 +6n66eyH75yp56c2PdxQ 13193.0 +FkpSyCaSiA2X28rAMNt5687 -9301.0 +YsR62pfC2Hc 5381.0 +yinBY725P7V2 -13036.0 +507ydguwwD2G5Xm -15432.0 +2u7a6SbanjfvG -6519.0 +Q0TBQ1G -8090.0 +6ajiL10gD2Tr8 7642.0 +yGUgDSMYLV8CKnfp54 9647.0 +0Ryd7J0wt3N80Yc64GCpr1 12800.0 +hUe5btrA1 -3514.0 +DVIFt1UEtwik44e82 15860.0 +54L167LPWI4Xl340Xve8MU01 -14975.0 +L3Jpr8lO8Lt2PYA7JDLj8L 12681.0 +Wq8t31o3E6Nd -8519.0 +3L2hivdJPOxVN 10947.0 +5DDtS4Q -4882.0 +kro4Xu41bB7hiFa -3277.0 +2CiDSqJiKEr0JHgKF38uC -13361.0 +1t87645camEy7yy0Awe1M1 -14550.0 +d58e0 9827.0 +0tkxbt 2238.0 +854W2USVx2swYb5 -3640.0 +YuLAwEusr5vuTT07mPi2388j 1470.0 +TD5Y632oD1u -6280.0 +mk6lShdOa8kXT8i7mLd3fK NULL +4Bh47BqptHhw08erm -11844.0 +7BhEv636HK 1950.0 +31p023gt0v70DBDg8d2 -9487.0 +nUo56pHfXw 12049.0 +p5tQT3mBpiL4567e3I -13185.0 +B61uSoc -5411.0 +4236PQ -1431.0 +5T0k456v4 1517.0 +Ghx2a1SF4w11N4880KqG5TW 1926.0 +L7pnTrIg7Gaj0Vni13rRQeE 15007.0 +e8b2tc81ieVb0dF132Uuo -5653.0 +6eFM3n2MB3pMT5 7531.0 +25yg11q44eL27O18V6fRc 13200.0 +SADBxBjA50uC6BpWY27Dh48v -7535.0 +T56Yg20W -9313.0 +OST82YETg7Je2xE0J2 5245.0 +M7OQK3MFU5QYjW1ja5jEj2E0 2337.0 +Q54v68tVoY852n3kuOO5 13358.0 +NU7HSxxQR1770qn5gF7N 9607.0 +xAHh7BEoTHEWREl1W23h11UB -11860.0 +JnJSY4 -8084.0 +63r768eM3J1AolawQa4m78J -4285.0 +0F5hWvBF2QOa8A5ThNXq 7006.0 +t5JDt3u6jk748 -8181.0 +032inJMJt -16162.0 +c7awd4680fkDD47oM0N -15001.0 +mMqL1kdU -12778.0 +806vT7T4G4Y4 -2414.0 +52x3fW10Sfgy0gQC -7086.0 +sFfOv7WlW1b4ANUm01Xq 1388.0 +hd5NMHtI3AWTCX01GJU -1961.0 +M0JtV -13306.0 +0RrH6XDA1 -9987.0 +qn33qx7P6AO453mw7VnHqf -16020.0 +d57LuTxW0Pk5cXu 5215.0 +365IQF87op3G5G7 16218.0 +v1sjSTo 4924.0 +1Nq1NaA58A -15838.0 +kf3B156 7601.0 +e05ddw658QcMr 15229.0 +1x4u8Rl7K43d -4665.0 +RAaC3XB8wMh8On8X -13240.0 +u654E6tw3O5dpRaV8 -5654.0 +uB1n6f5s14Rll13S -14276.0 +5SUwkc 12499.0 +r6gCtT4Tgo5rG 15524.0 +TUD1CCM80q3J370 -10023.0 +2c06XNT8UBA24Wj6A 1719.0 +ERv3LDq47PD87kYanTw70I 14642.0 +4iAo20FElOq0ihncuFJO314W -4543.0 +fMx10nWYRbs 5721.0 +e882yM7Pp1RA3 8343.0 +134V61S01dD11l 3062.0 +w132NP2NSCmuh 8149.0 +kuvR7u5uL6OeGWB -1989.0 +OQk1qTc7L6BHW0IU5cbY 5188.0 +6tVht52PUI48RYfv5 -5298.0 +S37aN18 2453.0 +0i7NWa31V138w77wJf 2979.0 +fnVSD0s7dK 2140.0 +a 4991.0 +e8Ul5Q72 14527.0 +6AJtt50DqWDaDKY -647.0 +ad1nwBvW6Q1CV 4953.0 +Kii2TSi -5185.0 +qCQQ4UmnmkP -16109.0 +0KO13sQD80owUvaRJkgg 15837.0 +66wWE8r6 -3065.0 +1sU7A2KLR2QaP3Qu -13240.0 +3lb086sJ4qp5M3qJw6C8NjS -9285.0 +Ux34b0jriL3aTLaNEoYI 3158.0 +D02Xb5NBPo58PrT3i00 -15635.0 +G1u0pUmU6ehCm NULL +5nAPf8Jm 12793.0 +M1cu826gIgIfo 5640.0 +NgfUMoYbR7kETkr8 14073.0 +Nnp43RtjHVRbEhbREog -684.0 +0eL7WBS304SQ6PAp853 -10847.0 +lpqrfP03K543xi4HpDg -577.0 +4e4RSbbS -6299.0 +8A3dS 10195.0 +r42aU41pQBY7Xk3ic37hR 15098.0 +uGCC7IKaDqGe 1131.0 +HE362S2kjL1G 14774.0 +00RG6GmXCvpNN32S3045C26 169.0 +p2V22B730Pto1t1Q -10567.0 +BV10NpgCXpb7T80Ry2 9213.0 +XMd2TpQd0MJ2Kjh1d4Pf5 -9643.0 +2p6SD 4602.0 +cD68D3aJ6G88N1C -6999.0 +L05l0uM5UWt80OvwJ68M88N 11324.0 +uK7mk3STx7 2694.0 +V3Jyb -13918.0 +R2j4UBj -15179.0 +p6I7H7O3H7yX2AF5IeC -10294.0 +u6CLfg 10572.0 +BeCJRnF7x42QV53G -10424.0 +Q2cD8XsSGtv888622N 8252.0 +Oq7ddTu 10114.0 +FmYRwaLP -8114.0 +jOwQK4j08aYY8mhwcYU5 -9380.0 +led8KYCw1j2 -4512.0 +a58Ux 8558.0 +ujyM2MlphalNYG1WI48T74 -1107.0 +1GIFlv7Vi0434AjY 14577.0 +f0rlf3P0ce6V8Q4hiIX -457.0 +hs5N5IQsM6SM 1136.0 +8M43BDUxQ2t5 4637.0 +l5nrEK5m0jdOLive1Abf 4980.0 +3EM77 8138.0 +IU3HcXEu8b8J27ITo8EcwT 10352.0 +54o058c3mK6ewOQ5 -16309.0 +1rf8FQaP3T01QBY0hAA5PMb -450.0 +65n3amk86ayb7 4048.0 +F8GnKjK353rHy6 -1154.0 +8264P8f1IX -11675.0 +V7bu03S4t3F2XVt0P 8389.0 +33g681L -718.0 +dp4upQcltH1d7o -925.0 +pJd5ggPh0 14291.0 +MBXMM0lijJe2H22vU -4611.0 +G7Ve8Px6a7J0DafBodF8JMma -1291.0 +0qC12eb788WuYsfVmiN078 -7794.0 +NlcyfK 11044.0 +g2213 2366.0 +KG0HCim7s5nX -5626.0 +Wp7k2ma86M411kltU8O5gmBy 13663.0 +m2oLVT5wQeGN6E 10750.0 +C1f7dac7BM -2532.0 +kNiLPXX0ANEwwNotk -6352.0 +EDEC5l 1652.0 +pfsuj084setrttm5l6gYK -1473.0 +5kpmU7nYjC6 -15189.0 +CKu4687wOrD56FN -4627.0 +ug0p6KMaI4hM7VO 3987.0 +Kw3RwUP6RQaQCgVSHjU0Gqr4 -14133.0 +7tdXvglBVQXI0 -180.0 +OHG2wWD83Ba 6914.0 +kw28G8BE3xwP6ijE1 10347.0 +wKX3SY -8236.0 +4mWvIJC3fkoF0XMf24g0 -15358.0 +4hW4Nf1WU04 3874.0 +vTEtf8Qs51S4vnVG4 -7764.0 +78Ls67c -4916.0 +njaAsltsX10oT 8335.0 +uJGHsW3cd073NGFITyQ NULL +ASSe7kYrOuU1RY5xfqOu4 -6849.0 +0KFxcEp5oX6e5365X -5049.0 +8jKISHtr45yX5sUE0FGdMY 6052.0 +4v2OOIq40B8 1668.0 +f5wvsWTPgXUx8m7 -11780.0 +11JF0rvxETQpaqxn 9318.0 +8v3M46A 9471.0 +DUSKf88a 6764.0 +OXo62h3Qhvl2C 6750.0 +j0t1Apo7x66D60C5 -8588.0 +xPJN71vYb00l2QRpr0A8128 -14164.0 +tUFKK5Qb31YWBiNT440tv 1824.0 +4HkvsutO84B -1389.0 +04p3riU20lo7A7s0OvBepl 1887.0 +gebKn580IF5wc8d8C1 7246.0 +qjnGh17cDy3S4K -156.0 +5Sig5dg -2816.0 +GclmMLkS0 -4583.0 +0mQ565Vg5K1886 -7118.0 +wi8iTsDO0 4153.0 +5xFJJo8XfL3P4D0F8urjoY6w -16187.0 +71xiJm -8378.0 +YWIKIppGcJ7j1pxAH -823.0 +P55EBnQ5cCF5RW443l0U -985.0 +2b2VT 3083.0 +85AFBCqB -3706.0 +1FkF48y5 10541.0 +BIMMVF72hPLrx5b -6669.0 +1u170q 192.0 +kD3piv6YvImO3b -923.0 +hweo7wU2YAcJFa0axo 13266.0 +5y65rNnX4IsiQHRe8327 -12704.0 +6p2vWrdBsj30fSy0c7o5X7m5 15740.0 +SV7p0rH15H 10511.0 +7et28dsw03son237 -15298.0 +Tx2ghNxT1b -9677.0 +s5V2MYimc0 -11724.0 +Q2V028 -384.0 +C5JS4qveshY7mhNv4W -8154.0 +CDxPimlul3S23D -15139.0 +G1E36 12661.0 +ay5XPK0e5q3173 7657.0 +15iI6DdPRxH 1692.0 +2ljg4si1A 1103.0 +hnq6hkAfna 5926.0 +3GQ55vjr7oQI3u55bFk4GOL -4251.0 +KG2X4bEy5bahXgT7OPn -10416.0 +82A762MP5i04n3Yn6oHPLn4 15957.0 +amj5TglKcJV4yx -10961.0 +g6YBvB2o1c3qbfV6N -12991.0 +3Q2X6uNR28uvSJ5CXA25N4j 4092.0 +rmshOh3J4a8 -7246.0 +Yl6DY284s40Np2xg3QXxpi 14993.0 +UL8rV5M81k6hVJ -13050.0 +IcM1YI 1600.0 +1tJ44D7df078VJPOgd38 -15731.0 +Ykmey2mN6W4 -10141.0 +2jpKwIdt6T -13331.0 +eYkUnb8 -2791.0 +Bd06F615GTlaWOiSY2 11904.0 +xptM81y 67.0 +f6f4h5NY5Ffi 2017.0 +7PuoKiD38nQmIK4T 13000.0 +43Ad7 4223.0 +qBbicAX56Fb7ay6w3p 14367.0 +QI3ERh13R 10725.0 +FWdV3V4qGH003 1836.0 +ytDPXRk7jKV0i 15067.0 +DWVt0e 3109.0 +pMb26nLwOep46S63x1WjPC 2480.0 +NeXCu 8825.0 +5j7GJ8OCXgMVIcK7 NULL +7g13w40lHv7wDaf1m4MQ8m 15869.0 +78BOELSKlk1as7F 10725.0 +7etT21xSNx 8285.0 +K8COoSc8N 680.0 +O5L38Cc7moc2 1638.0 +2Mf0x4c2BF24c2w734t1EY72 -11521.0 +Y76SnsrcY42lcA 4013.0 +x3RsvSIPV8T36SXbYDh4KkJ7 12610.0 +4OaUPT5Nv11mnb1XInK3 11730.0 +2v73jy37DkO67k257 -13685.0 +L6sf8vbxQUw1NIDX 71.0 +b5Yi033H6f4Wfaa0E62F3i5 5575.0 +SBV3XOTy5q54 -8940.0 +K7tGy146ydka -1236.0 +CS7804r4A 782.0 +aQW84A -3947.0 +30raB4mNQ1Fy0TFyR7kriGif 13074.0 +1pUrix3 -13230.0 +LrB67irl3Ple5OW -5504.0 +NUF2mivU8hgb7bX5b23tEE -7692.0 +7VFqt831tqF8B74sT06h5 1396.0 +51pwyg3Pdfr0 -12285.0 +63Y5AC7 351.0 +3p7ishFv1NEH3Q645h5D1 -473.0 +IQ22672kj6OBu1T3 12705.0 +122J3HlhqBW1D43 58.0 +hW33k4mf1gQ 5645.0 +N2FH0or4rUw3OV -11000.0 +04A5E86G57oUmoA1r7V 9712.0 +D63exrPA1TG2XQd6406tA -12593.0 +8iF83 -2594.0 +3Idv5J5S26xE -8323.0 +s1LyExi -4910.0 +40WAu -429.0 +V165NFpSX4b -13311.0 +POMHxg1V87N57tlSe -1564.0 +M20p14od2 -13368.0 +8166346wkHn 151.0 +D5Eid -1003.0 +BRM3geidCoOv6Kw -10813.0 +C7H805 -383.0 +Wl8KM -7757.0 +yDPDAYJSvfYM7Kkl2JVw -13295.0 +43Uw5KU1 10719.0 +tsEKn4ob21O14dx516nuN8U 6579.0 +1A0Vt -14297.0 +s0v64CJR22531 -15550.0 +pExfh0681v3E6 -13377.0 +gxV35xi1i6 8811.0 +BkB01vNgv 1116.0 +6Fd38ih -34.0 +DB7G66662B588sgbu4tP -9437.0 +dva4oJ47tw0wM52vCYU 10596.0 +SQ11E10EY5RbywY480mmc1P8 2047.0 +ihk4IyjQeRwF6 -11944.0 +8JUFg0n 13793.0 +ojrHQys7e2N52 6770.0 +MlWjcCEREOKUL1e6gQ61 -6116.0 +anVE0u 16018.0 +d6kPi7FNW1Y 8653.0 +i8Sn3a6i30o1o 6257.0 +w6TGrxC 2108.0 +2QLj36ndEKWf0rQ760470y5v -11364.0 +2eF0C4T4B0 -1379.0 +1Wqy6K6WJaUuutA4l6iQ -3598.0 +gqf1847u6CuJaw4D6 336.0 +dMG4N -6850.0 +DX2rT -9078.0 +h86fWF 3679.0 +rhqUT3n3jg8ufR6 -12179.0 +WjHDUL4OQP6G 8760.0 +A5hjodl6Y 16292.0 +eNsh5tYa NULL +gA0pGkli -12404.0 +a -5905.0 +WRkks7PCYNV8HBrjy0C61V 13309.0 +88uIRN0UF3KgxUukV7l82nN6 -4340.0 +105aFDAt30c4rI4U -14674.0 +o66Rv34sY2B2lqcTI1 15892.0 +66r78Ydee71CbjdYC4AJ7p 15154.0 +DYBN0 -14648.0 +ha4TkVEql240gCbQ17A -10760.0 +R0n26g5jglBqe6IUt 4979.0 +8l50D2mQ2 13109.0 +dun2EEixI701imr3d6a -8352.0 +TY6onJD -12471.0 +dsKMPeiKlSpS630o -937.0 +3ioX5Nm0A878KIjG -16211.0 +UlWG4BWte66 -9374.0 +7lsB56s1512O40v8Lb7 -12860.0 +s3Q3nW2K1uFid4x1NeDVn5 2663.0 +hd2iP4vyF -8454.0 +Ej1201f0iV3 9532.0 +65VIeeMM00MHr8I0 14504.0 +1g4rMLDk488w2 9661.0 +dfGQS66i2xSq5TmD7 -2704.0 +FqW3gSD2 12220.0 +Cfcf1e8dF672e -3335.0 +njgth -12635.0 +5myx87LGMU -1379.0 +8vFbY6BM35cX2G -872.0 +876nMq6Po0d428mkF -5490.0 +e4ie13qpm6LnXF21C5 -14982.0 +O8VNn236c111 -13818.0 +Asb78n5F8touWJspj6y -4163.0 +U2414rwp5V8W20qd8kk5 -13512.0 +xjHndXs -1604.0 +Oqj3145snjOaP7P7rN8xe 14619.0 +0xfBP5JTQaqgj 5983.0 +6x1C4Y57mY3 11558.0 +3UtQ8 8531.0 +K2R478jQIc54 -13332.0 +kEY057j8 15561.0 +58M3ixFwbF5TH4x1FxFr -9825.0 +7Qy0j102iq4kv45G -4909.0 +5BQei07Qp1B1SWD08Nf4 -9551.0 +j5uHPfYypfS4dcT7nd 7129.0 +AHd7wkKJOW0oL11A30rx1 15347.0 +1lh1E3r8fKyRTiC1HwYgN 12853.0 +V4c6wY3jblNaug4DmyrR 12214.0 +5cN3HGI4KhCrP 15570.0 +g1k40P8l -8277.0 +T66vQ50YfGj -9190.0 +hnyI5T -1309.0 +126aSR -1988.0 +UB0pacKH5Icw -6944.0 +b2mHRIps75fH7821d -2787.0 +QOh77Nn0071FMlBWw 15897.0 +Iv73gFc -6988.0 +ycx8b7P8h2O87cJD 6866.0 +xkBpGD3d0cmjoeBFJ8g -12878.0 +FhXANp2KDtMmA2gFd778pA 3523.0 +Qc722Gg4280 13690.0 +s53mOU -13517.0 +0IThjaO883De3DbuerQDt0 -13668.0 +js560HSj230 9019.0 +8x6mobxQl6Ef0Hl1 11417.0 +tDTvP10c 6260.0 +tphLsg0p 13156.0 +DWewuaY -2489.0 +X7vKpt286BLxBIgQ 7723.0 +dD15XhaAk -7298.0 +7UcmGTD0H3teObxa3PIKsChx -4191.0 +fv6s5tGQJO45BvV4m8C -329.0 +yy2GiGM -5381.0 +Q1JAdUlCVORmR0Q5X5Vf5u6 NULL +64xc3K542PGU2l2 -13657.0 +Kamb1E 7882.0 +k01Ir4eR2jd 13020.0 +r251rbt884txX2MNq4MM14 -16296.0 +vXdw480bs0o1HQK3BLhb4A2 8848.0 +R1dYp46f6 13776.0 +qtkJR2MeV1 6723.0 +3c4ER4QtMJwx83mT5Xp 10583.0 +0TQ0HK5x8 418.0 +11F2M 12205.0 PREHOOK: query: drop table store PREHOOK: type: DROPTABLE PREHOOK: Input: default@store diff --git serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java index 2488a44..acb51f9 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java +++ serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java @@ -64,6 +64,14 @@ public WriteBuffers(int wbSize, long maxSize) { nextBufferToWrite(); } + public int readVInt() { + return (int) readVLong(defaultReadPos); + } + + public int readVInt(Position readPos) { + return (int) readVLong(readPos); + } + public long readVLong() { return readVLong(defaultReadPos); } @@ -358,6 +366,19 @@ public long getReadPoint(Position readPos) { return (readPos.bufferIndex * (long)wbSize) + readPos.offset; } + public void getByteSegmentRefToCurrent(ByteSegmentRef byteSegmentRef, int length, + Position readPos) { + + byteSegmentRef.reset((readPos.bufferIndex * (long)wbSize) + readPos.offset, length); + if (length > 0) { + populateValue(byteSegmentRef); + } + } + + public void writeVInt(int value) { + LazyBinaryUtils.writeVInt(this, value); + } + public void writeVLong(long value) { LazyBinaryUtils.writeVLong(this, value); } @@ -425,7 +446,9 @@ public int getLength() { } public ByteBuffer copy() { byte[] copy = new byte[length]; - System.arraycopy(bytes, (int)offset, copy, 0, length); + if (length > 0) { + System.arraycopy(bytes, (int)offset, copy, 0, length); + } return ByteBuffer.wrap(copy); } private byte[] bytes = null; diff --git serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java index 6b2675c..285ae10 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java +++ serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/fast/BinarySortableSerializeWrite.java @@ -85,7 +85,7 @@ private BinarySortableSerializeWrite() { } /* - * Set the buffer that will receive the serialized data. + * Set the buffer that will receive the serialized data. The output buffer will be reset. */ @Override public void set(Output output) { @@ -95,6 +95,15 @@ public void set(Output output) { } /* + * Set the buffer that will receive the serialized data. The output buffer will NOT be reset. + */ + @Override + public void setAppend(Output output) { + this.output = output; + index = -1; + } + + /* * Reset the previously supplied buffer that will receive the serialized data. */ @Override diff --git serde/src/java/org/apache/hadoop/hive/serde2/fast/SerializeWrite.java serde/src/java/org/apache/hadoop/hive/serde2/fast/SerializeWrite.java index 8e586fb..e6fb8b6 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/fast/SerializeWrite.java +++ serde/src/java/org/apache/hadoop/hive/serde2/fast/SerializeWrite.java @@ -31,19 +31,25 @@ /* * Directly serialize with the caller writing field-by-field a serialization format. - * + * * The caller is responsible for calling the write method for the right type of each field * (or calling writeNull if the field is a NULL). - * + * */ public interface SerializeWrite { /* - * Set the buffer that will receive the serialized data. + * Set the buffer that will receive the serialized data. The output buffer will be reset. */ void set(Output output); /* + * Set the buffer that will receive the serialized data. The output buffer will NOT be reset. + */ + void setAppend(Output output); + + + /* * Reset the previously supplied buffer that will receive the serialized data. */ void reset(); diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleSerializeWrite.java serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleSerializeWrite.java index 0771b12..77838a1 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleSerializeWrite.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleSerializeWrite.java @@ -106,7 +106,7 @@ private LazySimpleSerializeWrite() { } /* - * Set the buffer that will receive the serialized data. + * Set the buffer that will receive the serialized data. The output buffer will be reset. */ @Override public void set(Output output) { @@ -116,6 +116,15 @@ public void set(Output output) { } /* + * Set the buffer that will receive the serialized data. The output buffer will NOT be reset. + */ + @Override + public void setAppend(Output output) { + this.output = output; + index = 0; + } + + /* * Reset the previously supplied buffer that will receive the serialized data. */ @Override @@ -123,7 +132,7 @@ public void reset() { output.reset(); index = 0; } - + /* * General Pattern: * diff --git serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinarySerializeWrite.java serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinarySerializeWrite.java index 8cb2741..e0d9c0a 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinarySerializeWrite.java +++ serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/fast/LazyBinarySerializeWrite.java @@ -71,7 +71,7 @@ private LazyBinarySerializeWrite() { } /* - * Set the buffer that will receive the serialized data. + * Set the buffer that will receive the serialized data. The output buffer will be reset. */ @Override public void set(Output output) { @@ -83,6 +83,17 @@ public void set(Output output) { } /* + * Set the buffer that will receive the serialized data. The output buffer will NOT be reset. + */ + @Override + public void setAppend(Output output) { + this.output = output; + fieldIndex = 0; + nullByte = 0; + nullOffset = output.getLength(); + } + + /* * Reset the previously supplied buffer that will receive the serialized data. */ @Override @@ -92,7 +103,7 @@ public void reset() { nullByte = 0; nullOffset = 0; } - + /* * General Pattern: *