@CombineFunction public static void combine(@AggregationState DigestAndPercentileState state, DigestAndPercentileState otherState) { QuantileDigest input = otherState.getDigest(); QuantileDigest previous = state.getDigest(); if (previous == null) { state.setDigest(input); state.addMemoryUsage(input.estimatedInMemorySizeInBytes()); } else { state.addMemoryUsage(-previous.estimatedInMemorySizeInBytes()); previous.merge(input); state.addMemoryUsage(previous.estimatedInMemorySizeInBytes()); } state.setPercentile(otherState.getPercentile()); }
@InputFunction public static void input(@AggregationState DigestAndPercentileState state, @SqlType(StandardTypes.BIGINT) long value, @SqlType(StandardTypes.DOUBLE) double percentile) { QuantileDigest digest = state.getDigest(); if (digest == null) { digest = new QuantileDigest(0.01); state.setDigest(digest); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); } state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes()); digest.add(value); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); // use last percentile state.setPercentile(percentile); }
@InputFunction public static void weightedInput(@AggregationState DigestAndPercentileState state, @SqlType(StandardTypes.BIGINT) long value, @SqlType(StandardTypes.BIGINT) long weight, @SqlType(StandardTypes.DOUBLE) double percentile) { checkWeight(weight); QuantileDigest digest = state.getDigest(); if (digest == null) { digest = new QuantileDigest(0.01); state.setDigest(digest); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); } state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes()); digest.add(value, weight); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); // use last percentile state.setPercentile(percentile); }
@InputFunction public static void weightedInput(@AggregationState DigestAndPercentileState state, @SqlType(StandardTypes.BIGINT) long value, @SqlType(StandardTypes.BIGINT) long weight, @SqlType(StandardTypes.DOUBLE) double percentile, @SqlType(StandardTypes.DOUBLE) double accuracy) { checkWeight(weight); QuantileDigest digest = state.getDigest(); if (digest == null) { if (accuracy > 0 && accuracy < 1) { digest = new QuantileDigest(accuracy); } else { throw new IllegalArgumentException("Percentile accuracy must be strictly between 0 and 1"); } state.setDigest(digest); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); } state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes()); digest.add(value, weight); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); // use last percentile state.setPercentile(percentile); }
@Override public void deserialize(Block block, int index, DigestAndPercentileState state) { SliceInput input = VARBINARY.getSlice(block, index).getInput(); // read percentile state.setPercentile(input.readDouble()); // read digest int length = input.readInt(); QuantileDigest digest = new QuantileDigest(input.readSlice(length)); state.setDigest(digest); state.addMemoryUsage(state.getDigest().estimatedInMemorySizeInBytes()); } }
@CombineFunction public static void combine(DigestAndPercentileState state, DigestAndPercentileState otherState) { QuantileDigest input = otherState.getDigest(); QuantileDigest previous = state.getDigest(); if (previous == null) { state.setDigest(input); state.addMemoryUsage(input.estimatedInMemorySizeInBytes()); } else { state.addMemoryUsage(-previous.estimatedInMemorySizeInBytes()); previous.merge(input); state.addMemoryUsage(previous.estimatedInMemorySizeInBytes()); } state.setPercentile(otherState.getPercentile()); }
@InputFunction public static void input(DigestAndPercentileState state, @SqlType(StandardTypes.BIGINT) long value, @SqlType(StandardTypes.DOUBLE) double percentile) { QuantileDigest digest = state.getDigest(); if (digest == null) { digest = new QuantileDigest(0.01); state.setDigest(digest); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); } state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes()); digest.add(value); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); // use last percentile state.setPercentile(percentile); }
@InputFunction public static void weightedInput(DigestAndPercentileState state, @SqlType(StandardTypes.BIGINT) long value, @SqlType(StandardTypes.BIGINT) long weight, @SqlType(StandardTypes.DOUBLE) double percentile) { checkWeight(weight); QuantileDigest digest = state.getDigest(); if (digest == null) { digest = new QuantileDigest(0.01); state.setDigest(digest); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); } state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes()); digest.add(value, weight); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); // use last percentile state.setPercentile(percentile); }
@InputFunction public static void weightedInput(DigestAndPercentileState state, @SqlType(StandardTypes.BIGINT) long value, @SqlType(StandardTypes.BIGINT) long weight, @SqlType(StandardTypes.DOUBLE) double percentile, @SqlType(StandardTypes.DOUBLE) double accuracy) { checkWeight(weight); QuantileDigest digest = state.getDigest(); if (digest == null) { if (accuracy > 0 && accuracy < 1) { digest = new QuantileDigest(accuracy); } else { throw new IllegalArgumentException("Percentile accuracy must be strictly between 0 and 1"); } state.setDigest(digest); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); } state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes()); digest.add(value, weight); state.addMemoryUsage(digest.estimatedInMemorySizeInBytes()); // use last percentile state.setPercentile(percentile); }
@Override public void deserialize(Block block, int index, DigestAndPercentileState state) { if (!block.isNull(index)) { SliceInput input = VARCHAR.getSlice(block, index).getInput(); // read digest state.setDigest(QuantileDigest.deserialize(input)); state.addMemoryUsage(state.getDigest().estimatedInMemorySizeInBytes()); // read percentile state.setPercentile(input.readDouble()); } } }