Search in sources :

Example 1 with RawScanResultConsumer

use of org.apache.hadoop.hbase.client.RawScanResultConsumer in project hbase by apache.

the class AsyncAggregationClient method findMedian.

private static <R, S, P extends Message, Q extends Message, T extends Message> void findMedian(CompletableFuture<R> future, RawAsyncTable table, ColumnInterpreter<R, S, P, Q, T> ci, Scan scan, NavigableMap<byte[], S> sumByRegion) {
    double halfSum = ci.divideForAvg(sumByRegion.values().stream().reduce(ci::add).get(), 2L);
    S movingSum = null;
    byte[] startRow = null;
    for (Map.Entry<byte[], S> entry : sumByRegion.entrySet()) {
        startRow = entry.getKey();
        S newMovingSum = ci.add(movingSum, entry.getValue());
        if (ci.divideForAvg(newMovingSum, 1L) > halfSum) {
            break;
        }
        movingSum = newMovingSum;
    }
    if (startRow != null) {
        scan.withStartRow(startRow);
    }
    // we can not pass movingSum directly to an anonymous class as it is not final.
    S baseSum = movingSum;
    byte[] family = scan.getFamilies()[0];
    NavigableSet<byte[]> qualifiers = scan.getFamilyMap().get(family);
    byte[] weightQualifier = qualifiers.last();
    byte[] valueQualifier = qualifiers.first();
    table.scan(scan, new RawScanResultConsumer() {

        private S sum = baseSum;

        private R value = null;

        @Override
        public void onNext(Result[] results, ScanController controller) {
            try {
                for (Result result : results) {
                    Cell weightCell = result.getColumnLatestCell(family, weightQualifier);
                    R weight = ci.getValue(family, weightQualifier, weightCell);
                    sum = ci.add(sum, ci.castToReturnType(weight));
                    if (ci.divideForAvg(sum, 1L) > halfSum) {
                        if (value != null) {
                            future.complete(value);
                        } else {
                            future.completeExceptionally(new NoSuchElementException());
                        }
                        controller.terminate();
                        return;
                    }
                    Cell valueCell = result.getColumnLatestCell(family, valueQualifier);
                    value = ci.getValue(family, valueQualifier, valueCell);
                }
            } catch (IOException e) {
                future.completeExceptionally(e);
                controller.terminate();
            }
        }

        @Override
        public void onError(Throwable error) {
            future.completeExceptionally(error);
        }

        @Override
        public void onComplete() {
            if (!future.isDone()) {
                // we should not reach here as the future should be completed in onNext.
                future.completeExceptionally(new NoSuchElementException());
            }
        }
    });
}
Also used : RawScanResultConsumer(org.apache.hadoop.hbase.client.RawScanResultConsumer) IOException(java.io.IOException) Result(org.apache.hadoop.hbase.client.Result) Map(java.util.Map) NavigableMap(java.util.NavigableMap) TreeMap(java.util.TreeMap) Cell(org.apache.hadoop.hbase.Cell) NoSuchElementException(java.util.NoSuchElementException)

Aggregations

IOException (java.io.IOException)1 Map (java.util.Map)1 NavigableMap (java.util.NavigableMap)1 NoSuchElementException (java.util.NoSuchElementException)1 TreeMap (java.util.TreeMap)1 Cell (org.apache.hadoop.hbase.Cell)1 RawScanResultConsumer (org.apache.hadoop.hbase.client.RawScanResultConsumer)1 Result (org.apache.hadoop.hbase.client.Result)1