in src/main/java/org/apache/datasketches/hive/quantiles/GetQuantilesFromStringsSketchUDF.java [101:132]
public List<String> evaluate(final BytesWritable serializedSketch, final Boolean inclusive, final int number) {
if (serializedSketch == null) { return null; }
final ItemsSketch<String> sketch = ItemsSketch.getInstance(
String.class,
BytesWritableHelper.wrapAsMemory(serializedSketch),
Comparator.naturalOrder(),
new ArrayOfStringsSerDe()
);
if (sketch.isEmpty()) { return null; }
String[] quantiles = null;
if (number == 1) {
quantiles = new String[1];
quantiles[0] = sketch.getMinItem();
} else if (number == 2) {
quantiles = new String[2];
quantiles[0] = sketch.getMinItem();
quantiles[1] = sketch.getMaxItem();
} else if (number > 2) {
final double[] ranks = new double[number];
final double delta = 1.0 / (number - 1);
for (int i = 0; i < number; i++) {
ranks[i] = i * delta;
}
quantiles = sketch.getQuantiles(ranks,
(inclusive ? QuantileSearchCriteria.INCLUSIVE : QuantileSearchCriteria.EXCLUSIVE));
quantiles[number - 1] = sketch.getMaxItem(); // to ensure the max value is exact
}
if (quantiles == null) { return null; }
return Arrays.asList(quantiles);
}