分享

如何在结果集中继续过滤?

haohuily 发表于 2017-3-31 23:13:04 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 6218
以下是我的部分代码,输入是若干个uid,uid对应rowkey,已经查询出了这些uid的所有版本的信息,请问如何从结果中过滤出时间戳为某个时间段(比如2017/01/01 到 2017/03/31),name列为某个姓名(如ZHANGSAN)的rowkey?    (表中只有一个列族,info。  列有 info:name , info:age)[mw_shl_code=java,true]
                List<HBaseTableData> list = new ArrayList<>();                  
                Get get = null;  
                
                try {  
                    List<Get> gets = new ArrayList<>();  
                    for (String uid : uidsArr) {  
                        get = new Get(uid.trim().getBytes());  
                        get.setMaxVersions(versions);  
                        gets.add(get);  
                    }  
                    Result[] results = table.get(gets);  
                   
                    Cell[] cells;  
                    for (int i = 0; i < results.length; i++) {  
                        cells = results.rawCells();
                        list.addAll(getHBaseTableDataListFromCells(cells));  
          
                    }  
          
                    return list;  
          
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  [/mw_shl_code]

已有(3)人评论

跳转到指定楼层
xiaobaiyang 发表于 2017-4-1 08:25:39
可以使用hbase的过滤器或者协处理器进一步对查询结果进行过滤
回复

使用道具 举报

nextuser 发表于 2017-4-1 15:30:13
协处理器分两种类型,系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器。协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。一个是观察者(observer),类似于关系数据库的触发器。另一个是终端(endpoint)【了解即可】,动态的终端有点像存储过程。
#################################
观察者的设计意图是允许用户通过插入代码来重载协处理器框架的upcall方法,而具体的事件触发的callback方法由HBase的核心代码来执行。协处理器框架处理所有的callback调用细节,协处理器自身只需要插入添加或者改变的功能。
以HBase0.92版本为例,它提供了三种观察者接口:
RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan等。
WALObserver:提供WAL相关操作钩子。
MasterObserver:提供DDL-类型的操作钩子。如创建、删除、修改数据表等。
这些接口可以同时使用在同一个地方,按照不同优先级顺序执行.用户可以任意基于协处理器实现复杂的HBase功能层。HBase有很多种事件可以触发观察者方法,这些事件与方法从HBase0.92版本起,都会集成在HBase API中。不过这些API可能会由于各种原因有所改动,不同版本的接口改动比较大

#################################

编程实践(Code Example)
在该实例中,我们通过计算HBase表中行数的一个实例,来真实感受协处理器 的方便和强大。在旧版的HBase我们需要编写MapReduce代码来汇总数据表中的行数,在0.92以上的版本HBase中,只需要编写客户端的代码即可实现,非常适合用在WebService的封装上。

启用协处理器 Aggregation(Enable Coprocessor Aggregation)
我们有两个方法:
1.启动全局aggregation,能过操纵所有的表上的数据。通过修改hbase-site.xml这个文件来实现,只需要添加如下代码:
[mw_shl_code=bash,true]<property>
<name>
hbase.coprocessor.user.region.classes
<name>
<value>
org.apache.hadoop.hbase.coprocessor.AggregateImplementation
<value>
<property>[/mw_shl_code]
2.启用表aggregation,只对特定的表生效。通过HBase Shell 来实现。
(1)disable指定表。hbase> disable 'mytable'
(2)添加aggregation hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||'
(3)重启指定表 hbase> enable 'mytable'


统计行数代码(Code Snippet)
public class MyAggregationClient {


private static final byte[] TABLE_NAME = Bytes.toBytes("mytable");
private static final byte[] CF = Bytes.toBytes("vent");


public static void main(String[] args) throws Throwable {


Configuration customConf = new Configuration();
customConf.setStrings("hbase.zookeeper.quorum","node0,node1,node2"); //提高RPC通信时长
customConf.setLong("hbase.rpc.timeout", 600000); //设置Scan缓存
customConf.setLong("hbase.client.scanner.caching", 1000);
Configuration configuration = HBaseConfiguration.create(customConf);
AggregationClient aggregationClient = new AggregationClient(configuration);
Scan scan = new Scan(); //指定扫描列族,唯一值
scan.addFamily(CF);
long rowCount = aggregationClient.rowCount(TABLE_NAME, null, scan);
System.out.println("row count is " + rowCount);


}
}

回复

使用道具 举报

haohuily 发表于 2017-4-1 15:56:25
xiaobaiyang 发表于 2017-4-1 08:25
可以使用hbase的过滤器或者协处理器进一步对查询结果进行过滤

好的,已解决,谢谢~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条