HBase查询一张表的数据条数的方法

文章目录

  • HBase查询一张表的数据条数的方法
    • 0、写在前面
    • 1、HBase-Shell的count命令
    • 2、Scan操作获取数据条数
    • 3、执行Mapreduce任务
    • 4、Hive与HBase整合
    • 5、协处理器Coprocessor实现
    • 6、参考资料


0、写在前面

  • Linux版本:Ubuntu Kylin 16.04
  • Hadoop版本:Hadoop-2.7.2
  • Zookeeper版本:HBase自带
  • HBase版本:HBase-1.1.5
  • Hive版本:Hive-2.1.0

1、HBase-Shell的count命令

hbase(main):017:0> help 'count'
Count the number of rows in a table.  Return value is the number of rows.
This operation may take a LONG time (Run '$HADOOP_HOME/bin/hadoop jar
hbase.jar rowcount' to run a counting mapreduce job). Current count is shown every 1000 rows by default. Count interval may be optionally specified. Scan caching is enabled on count scans by default. Default cache size is 10 rows.If your rows are small in size, you may want to increase this
parameter. Examples:hbase> count 'ns1:t1'hbase> count 't1'hbase> count 't1', INTERVAL => 100000hbase> count 't1', CACHE => 1000hbase> count 't1', INTERVAL => 10, CACHE => 1000The same commands also can be run on a table reference. Suppose you had a reference
t to table 't1', the corresponding commands would be:hbase> t.counthbase> t.count INTERVAL => 100000hbase> t.count CACHE => 1000hbase> t.count INTERVAL => 10, CACHE => 1000

可以看到「使用count查询表的数据条数」这个操作可能需要消耗过长时间(运行’$HADOOP_HOME/bin/hadoop jar hbase.jar rowcount’ 来运行计数 mapReduce 作业)。

默认情况下,当前计数每 1000 行显示一次。可以选择指定计数间隔。默认情况下,对计数扫描启用扫描缓存。默认缓存大小为 10 行。

2、Scan操作获取数据条数

通过Java API的方式,使用scan进行全表扫描,循环计数RowCount,速度较慢! 但快于第一种count方式!

基本代码如下:

public void rowCountByScanFilter(String tablename){long rowCount = 0;try {// 计时StopWatch stopWatch = new StopWatch();stopWatch.start();TableName name=TableName.valueOf(tablename);// connection为类静态变量Table table = connection.getTable(name);Scan scan = new Scan();// FirstKeyOnlyFilter只会取得每行数据的第一个kv,提高count速度scan.setFilter(new FirstKeyOnlyFilter());ResultScanner rs = table.getScanner(scan);for (Result result : rs) {rowCount += result.size();}stopWatch.stop();System.out.println("RowCount: " + rowCount);System.out.println("统计耗时:" +stopWatch.getTotalTimeMillis());} catch (Throwable e) {e.printStackTrace();}
}

3、执行Mapreduce任务

zhangsan@node01:/usr/local/hbase-1.1.5/bin$ ./hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘yourtablename’

这种方式效率比第一种要高,调用的HBase jar中自带的统计行数的类。

4、Hive与HBase整合

我们通过建立Hive和HBase关联表的方式,可以直接在Hive中执行sql语句统计出HBase表的行数。

  • 启动hdfs
zhangsan@node01:/usr/local/hadoop-2.7.2/sbin$ ./start-dfs.sh
  • 启动HBase
zhangsan@node01:/usr/local/hbase-1.1.5/bin$ ./start-hbase.sh
zhangsan@node01:/usr/local/hbase/bin$ jps
3648 Jps
2737 DataNode
3555 HRegionServer
2948 SecondaryNameNode
3337 HQuorumPeer
2604 NameNode
3436 HMaster
  • 启动hiveserver2服务
zhangsan@node01:/usr/local/hive-2.1.0/bin$ hiveserver2
  • 启动HBase Shell,建表
zhangsan@node01:/usr/local/hbase-1.1.5/bin$ hbase shell
# HBase 建表
create 'hbase_hive_test', 'cf1'
  • hive建立映射表
zhangsan@node01:/usr/local/hive-2.1.0/bin$ hive
hive>create table hive_hbase_test(key int,value string)>stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' >with serdeproperties("hbase.columns.mapping"=":key,cf1:val") >tblproperties("hbase.table.name"="hive_hbase_test");
OK
Time taken: 8.018 seconds
  • 在HBase中查看是否存在映射表
hbase(main):001:0>  list
TABLE
hive_hbase_test
1 row(s) in 0.6800 seconds
=> ["hive_hbase_test"]

5、协处理器Coprocessor实现

该方法是目前最快实现「查询一张表的数据条数」的方法

为什么利用协处理器后速度会如此之快?

Table注册了Coprocessor之后,在执行AggregationClient的时候,会将RowCount分散到Table的每一个Region上,Region内RowCount的计算,是通过RPC执行调用接口,由Region对应的RegionServer执行InternalScanner进行的。

因此,性能的提升有两点原因:

1.分布式统计。将原来客户端按照Rowkey的范围单点进行扫描,然后统计的方式,换成了由所有Region所在RegionServer同时计算的过程。

2.使用了在RegionServer内部执行使用了InternalScanner。这是距离实际存储最近的Scanner接口,存取更加快捷。

public void rowCountByCoprocessor(String tablename){try {//提前创建connection和confAdmin admin = connection.getAdmin();TableName name=TableName.valueOf(tablename);//先disable表,添加协处理器后再enable表admin.disableTable(name);HTableDescriptor descriptor = admin.getTableDescriptor(name);String coprocessorClass = "org.apache.hadoop.hbase.coprocessor.AggregateImplementation";if (! descriptor.hasCoprocessor(coprocessorClass)) {descriptor.addCoprocessor(coprocessorClass);}admin.modifyTable(name, descriptor);admin.enableTable(name);//计时StopWatch stopWatch = new StopWatch();stopWatch.start();Scan scan = new Scan();AggregationClient aggregationClient = new AggregationClient(conf);System.out.println("RowCount: " + aggregationClient.rowCount(name, new LongColumnInterpreter(), scan));stopWatch.stop();System.out.println("统计耗时:" +stopWatch.getTotalTimeMillis());} catch (Throwable e) {e.printStackTrace();}
}

6、参考资料

  • 参考1

HBase查询一张表的数据条数的方法相关推荐

  1. 快速统计hbase中某张表中数据条数

    2019独角兽企业重金招聘Python工程师标准>>> 在shell命令行执行(不是hbase客户端命令行) hbase org.apache.hadoop.hbase.mapred ...

  2. 更改mysql表显示数据条数_layui数据表格自定义每页条数limit设置

    废话不多说,直接上代码吧!如下所示: table.render({ elem: '#data_grid' //,width: 900 //,height: 274 ,cols: [[ //标题栏 {f ...

  3. Hbase查询一张表的行数

    1.第一种方法(适用于表数据量不太大的情况) 最直接的方式是在hbase shell中执行count的命令可以统计行数. hbase> count 't1′ hbase> count 't ...

  4. html查询一张表,HTML5数据查询,表格显示功能代码教程

    TWaver HTML5发布已有一段时间,使用的客户也是逐渐增加, 于是我也迫不及待地申请了一个试用版来写一个小网页, 最近正在写到数据查询,表格显示的功能.表格组件在HTML5中是提供的, 查看TW ...

  5. C# 查询一张表的数据用于补充另外一张表的数据 MySQL数据库

    UPDATE `bookhistory` bh set bh.CategoryId = (SELECT CategoryId FROM booklist bk where bk.Id = bh.Boo ...

  6. 只知道删除单张表的数据?不知道删除多张表的数据?

    一些废话 可能在某某一天,你在删除表的数据的时候,不想一张表一张表的去删除,想把两个表的数据同时删除:然后你就会去搜索,然后你就很有很有很有很有可能会看到 me 的这篇优质(呸!!!)文章了~ 嗯,没 ...

  7. access重复数据累计_Access 查询同一张表中两个或以上字段含有重复项的记录

    这篇文章是对我自己另一篇文章的补充.( Access 查询同一张表中某个字段含有重复项的记录) 记录的动力总是来自于工作中遇到的问题.上次只要根据某个字段把有重复项的记录列出来,这次条件增多了,要根据 ...

  8. mysql一张表100亿条数据_一个表有100亿条记录,如何优化

    我们的数据库还在设计阶段.我们预计数据量将会很大,一年的时间里,一张表,就会产生100亿条数据,表结构,如下id,userid,createddate,等等正常情况下,100亿条记录如果都存在一个表里 ...

  9. php 查询同一张表相同数据,SQL查出一张表中重复的所有记录数据

    1.在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下:SELECT * from xi a where (a.username) in ( ...

最新文章

  1. linux shell case语句
  2. JavaScript中的Try...Catch 语句
  3. 设计模式6+1大原则
  4. python 速度 memmap_浅析Python 读取图像文件的性能对比
  5. Spring Bean作用域实例
  6. 用再生龙Clonezilla 来克隆Linux系统!!
  7. python1011无标题_讲解:Python:COMP1011 Programming For The WebPython
  8. 怎么修改x轴_Origin绘图:共X轴Stack绘制分波态密度与绘图中的科学构思
  9. 比尔盖茨:若新冠病毒疫苗有效 富裕国家在2021年底恢复正常
  10. Java基础知识编写一个HelloWorld案例
  11. java string常见操作题
  12. 送你一份计算机视觉精品学习资料,学完拿高薪offer!
  13. java 算数运算符
  14. flume流程之http-memory-hdfs
  15. 双人成行本地安装X360ce模拟手柄教程xpadder手柄模拟键盘鼠标
  16. smartbi和第三方集成策略
  17. Chrome浏览器默认全屏启动(非--kiosk模式)
  18. CSS calc无效
  19. Sdkman运行时INTERNET NOT REACHABLE问题和解决
  20. 公司邮箱怎么注册?公司企业邮箱怎么登录?

热门文章

  1. Qt错误 error: C2228: “.exec”的左边必须有类/结构/联合 的解决方法
  2. oracle例外使用
  3. 视频加密后的录屏行为怎么做防范?
  4. 手把手教你制作docSet文档(用于Dash或zeal)
  5. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计 - ModestMT.Zou - 博客园...
  6. HTML-table单行操作
  7. MySQL海量数据项目实战
  8. 计算机实习报告6000字,实习报告6000
  9. 微软欲用Silverlight阻击Flash
  10. DOS死机客星,能打破程序死循环,按住Ctrl +Esc即可使死掉的程序立即返回到Dos Shell