hbase本身提供了 聚合方法可以服务端聚合操作

hbase中的CoprocessorProtocol机制.

CoprocessorProtocol的原理比较简单,近似于一个mapreduce框架。由client将scan分解为面向多个region的请求,并行发送请求到多个region,然后client做一个reduce的操作,得到最后的结果。

先看一个例子,使用hbase的AggregationClient可以做到简单的面向单个column的统计。

  1. @Test
  2. public void testAggregationClient() throws Throwable {
  3. LongColumnInterpreter columnInterpreter = new LongColumnInterpreter();
  4. AggregationClient aggregationClient = new AggregationClient(
  5. CommonConfig.getConfiguration());
  6. Scan scan = new Scan();
  7. scan.addColumn(ColumnFamilyName, QName1);
  8. Long max = aggregationClient.max(TableNameBytes, columnInterpreter,
  9. scan);
  10. Assert.assertTrue(max.longValue() == 100);
  11. Long min = aggregationClient.min(TableNameBytes, columnInterpreter,
  12. scan);
  13. Assert.assertTrue(min.longValue() == 20);
  14. Long sum = aggregationClient.sum(TableNameBytes, columnInterpreter,
  15. scan);
  16. Assert.assertTrue(sum.longValue() == 120);
  17. Long count = aggregationClient.rowCount(TableNameBytes,
  18. columnInterpreter, scan);
  19. Assert.assertTrue(count.longValue() == 4);
  20. }

看下hbase的源码。AggregateImplementation

  1. @Override
  2. public <T, S> T getMax(ColumnInterpreter<T, S> ci, Scan scan)
  3. throws IOException {
  4. T temp;
  5. T max = null;
  6. InternalScanner scanner = ((RegionCoprocessorEnvironment) getEnvironment())
  7. .getRegion().getScanner(scan);
  8. List<KeyValue> results = new ArrayList<KeyValue>();
  9. byte[] colFamily = scan.getFamilies()[0];
  10. byte[] qualifier = scan.getFamilyMap().get(colFamily).pollFirst();
  11. // qualifier can be null.
  12. try {
  13. boolean hasMoreRows = false;
  14. do {
  15. hasMoreRows = scanner.next(results);
  16. for (KeyValue kv : results) {
  17. temp = ci.getValue(colFamily, qualifier, kv);
  18. max = (max == null || (temp != null && ci.compare(temp, max) > 0)) ? temp : max;
  19. }
  20. results.clear();
  21. } while (hasMoreRows);
  22. } finally {
  23. scanner.close();
  24. }
  25. log.info("Maximum from this region is "
  26. + ((RegionCoprocessorEnvironment) getEnvironment()).getRegion()
  27. .getRegionNameAsString() + ": " + max);
  28. return max;
  29. }

这里由于

  1. byte[] colFamily = scan.getFamilies()[0];
  2. byte[] qualifier = scan.getFamilyMap().get(colFamily).pollFirst();

所以,hbase自带的Aggregate函数,只能面向单列进行统计。

当我们想对多列进行Aggregate,并同时进行countRow时,有以下选择。 
1 scan出所有的row,程序自己进行Aggregate和count。 
2 使用AggregationClient,调用多次,得到所有的结果。由于多次调用,有一致性问题。 
3 自己扩展CoprocessorProtocol。

这个是github的hbase集成插件

这个功能集成到simplehbase里面了。
https://github.com/zhang-xzhi/simplehbase

hbase 聚合操作的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

  2. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  3. .NET LINQ 聚合操作

    聚合操作      聚合运算从值集合计算单个值. 从一个月的日温度值计算日平均温度就是聚合运算的一个示例. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 ...

  4. HBase Shell操作

    Hbase 是一个分布式的.面向列的开源数据库,其实现是建立在google 的bigTable 理论之上,并基于hadoop HDFS文件系统.     Hbase不同于一般的关系型数据库(RDBMS ...

  5. hbase连接操作

    hbase连接操作 package com.test; import java.io.IOException; import org.apache.hadoop.conf.Configuration; ...

  6. Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)

    在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...

  7. OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念

    先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...

  8. hbase日常操作及维护

    一,基本命令: 建表:create 'testtable','coulmn1','coulmn2' 也可以建表时加coulmn的属性如:create 'testtable',{NAME => ' ...

  9. JDK1.8聚合操作

    在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果.这些聚合操作被称为聚合操作.JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个c ...

随机推荐

  1. 【bzoj 2870】 最长道路tree

    题目 边分治 边分和点分相比就是找到一条重心边,考虑所有经过这条边的路径,之后断开这条边分成两个联通块,继续分治 由于每次分治重心是一条边,所以只会产生两个联通块,考虑两个联通块显然要比像点分那样考虑 ...

  2. Spring 声明式事务管理(11)

    案例分析 本案例是图书管理系统精简部分,在数据库中有3张表.分别保存图书库存.图书信息和用户信息.下面是建表SQL语句 1 DROP TABLE IF EXISTS store; 2 DROP TAB ...

  3. SpringCloud学习笔记《---04 Hystrix---》基础篇

  4. Leetcode931. Minimum Falling Path Sum下降路径最小和

    给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和. 下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素.在下一行选择的元素和当前行所选元素最多相隔一列. 示例: 输入:[ ...

  5. .net Cache的用法

    HttpContext.Current.Cache 使用方法 .net Cache 怎么使用 /// <summary>        /// 简单创建/修改Cache,前提是这个值是字符 ...

  6. SaaS加速器,到底加速了谁? 剖析阿里云的SaaS战略:企业和ISV不可错过的好文

    过去二十年,中国诞生了大批To C的高市值互联网巨头,2C的领域高速发展,而2B领域一直不温不火.近两年来,在C端流量饱和,B端数字化转型来临的背景下,中国越来越多的科技公司已经慢慢将触角延伸到了B端 ...

  7. requirements.txt 作用

    requirements.txt的作用 用于记录所有依赖包及其精确的版本号.以便新环境部署. 使用pip生成 pip freeze >requirements.txt 当需要创建这个虚拟环境的完 ...

  8. java最大余数法(百分比算法Echarts)

    最近工作中使用Echarts开发报表的时候遇到了这样的一个问题,需求是一个div中左边是一个环形图表,右边是一个表格,表格中展示图表中每个类别占用的百分比.存在的问题:1.当存在四舍五入的时候,Ech ...

  9. java编程题古典算法之兔子问题

    1.题目如下. 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析每个月的兔子对数: 1---- ...

  10. 03_Sklearn的安装

    1.Scikit-learn库介绍:包含许多知名的机器学习算法的实现,文档完善.容易上手,丰富的API. 2.安装:创建一个基于Python3的虚拟环境(可以在已有的虚拟环境中):mkvirtuale ...