package brickhouse.udf.collect; import brickhouse.udf.collect.CollectMaxUDAF.MapCollectMaxUDAFEvaluator; import brickhouse.udf.collect.CollectMaxUDAF.MapCollectMaxUDAFEvaluator.MapAggBuffer; import junit.framework.Assert; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.Mode; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableIntObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableStringObjectInspector; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.junit.Test; import java.util.Map; public class CollectMaxTest { ///@Test public void testCollectMaxAggBuffer() throws HiveException { MapCollectMaxUDAFEvaluator maxEval = new MapCollectMaxUDAFEvaluator(true); WritableStringObjectInspector keyOI = (WritableStringObjectInspector) PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(PrimitiveCategory.STRING); WritableIntObjectInspector valOI = (WritableIntObjectInspector) PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(PrimitiveCategory.INT); maxEval.init(Mode.PARTIAL1, new ObjectInspector[]{keyOI, valOI}); MapAggBuffer buffer = (MapAggBuffer) maxEval.getNewAggregationBuffer(); Text key = new Text(); IntWritable val = new IntWritable(); for (int i = 0; i < 100; i++) { key.set(" Key # " + i); val.set(i); buffer.addValue(key, val); } Map<Text, IntWritable> valueMap = (Map<Text, IntWritable>) buffer.getValueMap(); int lastValue = 99; for (Map.Entry<Text, IntWritable> entry : valueMap.entrySet()) { System.out.println(" key is " + entry.getKey()); System.out.println(" val is " + entry.getValue()); Assert.assertTrue(entry.getValue().get() == lastValue); lastValue--; } Assert.assertEquals(CollectMaxUDAF.DEFAULT_MAX_VALUES, valueMap.size()); buffer.reset(); for (int i = 0; i < 1000; i++) { int rand = (int) (Math.random() * 10000.00); key.set(" Key # " + i); val.set(rand); buffer.addValue(key, val); } valueMap = (Map<Text, IntWritable>) buffer.getValueMap(); lastValue = Integer.MAX_VALUE; for (Map.Entry<Text, IntWritable> entry : valueMap.entrySet()) { System.out.println(" key is " + entry.getKey()); System.out.println(" val is " + entry.getValue()); Assert.assertTrue(entry.getValue().get() <= lastValue); } Assert.assertEquals(CollectMaxUDAF.DEFAULT_MAX_VALUES, valueMap.size()); } @Test public void testCollectMinAggBuffer() throws HiveException { MapCollectMaxUDAFEvaluator maxEval = new MapCollectMaxUDAFEvaluator(false); WritableStringObjectInspector keyOI = (WritableStringObjectInspector) PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(PrimitiveCategory.STRING); WritableIntObjectInspector valOI = (WritableIntObjectInspector) PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(PrimitiveCategory.INT); maxEval.init(Mode.PARTIAL1, new ObjectInspector[]{keyOI, valOI}); MapAggBuffer buffer = (MapAggBuffer) maxEval.getNewAggregationBuffer(); Text key = new Text(); IntWritable val = new IntWritable(); for (int i = 100; i >= 0; i--) { key.set(" Key # " + i); val.set(i); buffer.addValue(key, val); } Map<Text, IntWritable> valueMap = (Map<Text, IntWritable>) buffer.getValueMap(); int firstValue = 0; for (Map.Entry<Text, IntWritable> entry : valueMap.entrySet()) { System.out.println(" key is " + entry.getKey()); System.out.println(" val is " + entry.getValue()); Assert.assertTrue(entry.getValue().get() == firstValue); firstValue++; } Assert.assertEquals(CollectMaxUDAF.DEFAULT_MAX_VALUES, valueMap.size()); buffer.reset(); for (int i = 0; i < 100; i++) { key.set(" Key # " + i); val.set(i); buffer.addValue(key, val); } valueMap = (Map<Text, IntWritable>) buffer.getValueMap(); firstValue = 0; for (Map.Entry<Text, IntWritable> entry : valueMap.entrySet()) { System.out.println(" key is " + entry.getKey()); System.out.println(" val is " + entry.getValue()); Assert.assertTrue(entry.getValue().get() == firstValue); firstValue++; } Assert.assertEquals(CollectMaxUDAF.DEFAULT_MAX_VALUES, valueMap.size()); buffer.reset(); for (int i = 0; i < 1000; i++) { int rand = (int) (Math.random() * 10000.00); key.set(" Key # " + i); val.set(rand); buffer.addValue(key, val); } int lastValue = Integer.MIN_VALUE; valueMap = (Map<Text, IntWritable>) buffer.getValueMap(); for (Map.Entry<Text, IntWritable> entry : valueMap.entrySet()) { System.out.println(" key is " + entry.getKey()); System.out.println(" val is " + entry.getValue()); Assert.assertTrue(entry.getValue().get() >= lastValue); } Assert.assertEquals(CollectMaxUDAF.DEFAULT_MAX_VALUES, valueMap.size()); } }