1.关于filter的用法及说明参见这三篇博文,基本涵盖了绝大部分filter,很详细,还有实测代码,感谢博主的付出,特收藏.
HBase Filter:http://blog.sina.com.cn/s/blog_7431c7c50101c5ig.html
HBase(0.96以上版本)过滤器Filter详解及实例代码:http://blog.csdn.net/u010967382/article/details/37653177
HBase Filter介绍及执行流程:http://my.oschina.net/cloudcoder/blog/289649
2.通过coprocessor统计行数
关于协处理器的介绍和用法网上很多资料,可以自行查找脑补,值得注意的是协处理器在hbase服务器端执行,开发者可自定义处理器放置于服务器端然后再客户端调用,下面是一个简单的通过协处理器统计表行数的例子:
<span style="font-family:Arial Black;"><span style="font-family:Times New Roman;"> AggregationClient aggregation = new AggregationClient(conf); Long count = aggregation.rowCount(table, new LongColumnInterpreter(), s);//table为HTable实例,s为Scan实例 int totalCount = count.intValue();</span></span>要使得上述代码生效,还必须需要让要统计的表具有聚合功能。如下在hbase shell执行下面的命令:
* disable 'emp'
* alter 'emp',METHOD=>'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||'
* enable 'emp'
要删除协处理器,如下:
* disable 'emp'
* alter 'emp',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
* enable 'emp'
现实情况是不可能统计一个表的行数前去命令行执行下命令,于是可在统计行数前加上如下代码:
<span style="font-family:Arial Black;"><span style="font-family:Times New Roman;"> /** * 使表具有聚合功能 * * @param tableName * 表名 */ @SuppressWarnings("resource") private void enableAggregation(String tableName) { String coprocessorName = "org.apache.hadoop.hbase.coprocessor.AggregateImplementation"; try { HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor htd = admin.getTableDescriptor(Bytes .toBytes(tableName)); List<String> coprocessors = htd.getCoprocessors(); if (coprocessors != null && coprocessors.size() > 0) { return; } else { admin.disableTable(tableName); htd.addCoprocessor(coprocessorName); admin.modifyTable(tableName, htd); admin.enableTable(tableName); } } catch (TableNotFoundException e) { // TODO Auto-generated catch block log.error(e); } catch (MasterNotRunningException e) { // TODO Auto-generated catch block log.error(e); } catch (ZooKeeperConnectionException e) { // TODO Auto-generated catch block log.error(e); } catch (IOException e) { // TODO Auto-generated catch block log.error(e); } }</span></span>