use of com.yahoo.bullet.querying.aggregations.sketches.QuantileSketch.QUANTILE_FIELD in project bullet-core by yahoo.
the class QuantileSketchingStrategyTest method testQuantiles.
@Test
public void testQuantiles() {
QuantileSketchingStrategy distribution = makeDistribution("field", DistributionType.QUANTILE, 3);
IntStream.range(0, 2000).mapToDouble(i -> (i * 0.1)).mapToObj(d -> RecordBox.get().add("field", d).getRecord()).forEach(distribution::consume);
Clip result = distribution.getResult();
Map<String, Object> metadata = (Map<String, Object>) result.getMeta().asMap().get("meta");
Assert.assertEquals(metadata.size(), 7);
Assert.assertTrue((Boolean) metadata.get("isEst"));
Assert.assertEquals((String) metadata.get("family"), Family.QUANTILES.getFamilyName());
// Size should be at least 512 bytes since we inserted 2K uniques with sketch k set to 512
Assert.assertTrue((Integer) metadata.get("size") >= 512);
Assert.assertEquals(metadata.get("nre"), DoublesSketch.getNormalizedRankError(512));
// 60 items
Assert.assertEquals(metadata.get("n"), 2000L);
Assert.assertEquals(metadata.get("min"), 0.0);
Assert.assertEquals(metadata.get("max"), 199.9);
List<BulletRecord> records = result.getRecords();
Assert.assertEquals(records.size(), 3);
BulletRecord expectedA = RecordBox.get().add(QUANTILE_FIELD, 0.0).add(VALUE_FIELD, 0.0).getRecord();
BulletRecord expectedC = RecordBox.get().add(QUANTILE_FIELD, 1.0).add(VALUE_FIELD, 199.9).getRecord();
Assert.assertEquals(records.get(0), expectedA);
Assert.assertEquals(records.get(2), expectedC);
BulletRecord actualB = records.get(1);
Assert.assertEquals(actualB.typedGet(QUANTILE_FIELD).getValue(), 0.5);
Double actualMedian = (Double) actualB.typedGet(VALUE_FIELD).getValue();
// We insert 0,0.1, ... 199.9. Our median is around 100.0. Our NRE < 1%, so we can be pretty certain the median
// from the sketch is around this.
assertApproxEquals(actualMedian, 100.0, 2.0);
Assert.assertEquals(distribution.getRecords(), result.getRecords());
Assert.assertEquals(distribution.getMetadata().asMap(), result.getMeta().asMap());
}
use of com.yahoo.bullet.querying.aggregations.sketches.QuantileSketch.QUANTILE_FIELD in project bullet-core by yahoo.
the class QuantileSketchingStrategyTest method testRounding.
@Test
public void testRounding() {
QuantileSketchingStrategy distribution = makeDistribution(DistributionType.QUANTILE, 20, 6, 0.0, 1.0, 0.1);
IntStream.range(0, 10).mapToDouble(i -> i * 0.1).mapToObj(d -> RecordBox.get().add("field", d).getRecord()).forEach(distribution::consume);
Clip result = distribution.getResult();
Map<String, Object> metadata = (Map<String, Object>) result.getMeta().asMap().get("meta");
Assert.assertEquals(metadata.size(), 7);
Assert.assertFalse((Boolean) metadata.get("isEst"));
List<BulletRecord> records = result.getRecords();
Assert.assertEquals(records.size(), 11);
Set<String> actualQuantilePoints = records.stream().map(r -> r.typedGet(QUANTILE_FIELD).getValue().toString()).collect(Collectors.toSet());
Set<String> expectedQuantilePoints = new HashSet<>(Arrays.asList("0.0", "0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9", "1.0"));
Assert.assertEquals(actualQuantilePoints, expectedQuantilePoints);
Assert.assertEquals(distribution.getRecords(), result.getRecords());
Assert.assertEquals(distribution.getMetadata().asMap(), result.getMeta().asMap());
}
Aggregations