-
hbase 过滤0
目的:想做个分页查询。
思路:将条件封装成hbase filter.然后增加FirstKeyOnlyFilter.只获取first key 与分页参数比较,将第N的key分装成List<Get>,在去查询。
问题:
假设 family='s1' s1 列{"name","sex"}
1.发现使用SingleColumnValueFilter,条件过滤查询时没问题。增加FirstKeyOnlyFilter后,当条件只包含name,或者sex时,则SingleColumnValueFilter条件没起作用。
2.,将name,sex都用SingleColumnValueFilter封装成查询,在加上FirstKeyOnlyFilter,则可以查询出来。
简单代码
1.put
....
List<Put> list=new ArrayList<Put>();
Put p = new Put("2".getBytes());
p.add("s2".getBytes(), "id".getBytes(), "222".getBytes());
p.add("s2".getBytes(), "name".getBytes(), "美女".getBytes());
p.add("s2".getBytes(), "sex".getBytes(), "女".getBytes());
list.add(p);
Put p2 = new Put("3".getBytes());
p2.add("s2".getBytes(), "id".getBytes(), "223".getBytes());
p2.add("s2".getBytes(), "name".getBytes(), "野兽".getBytes());
p2.add("s2".getBytes(), "sex".getBytes(), "男".getBytes());
list.add(p2);
htable.put(list);
htable.flushCommits();
....
2.select
public static void selectByFilter(String tablename) throws IOException{
HTable table=new HTable(hbaseConfig,tablename);
FilterList filterList = new FilterList();
Scan s1 = new Scan(Bytes.toBytes("1"));
filterList.addFilter(new SingleColumnValueFilter("s2".getBytes(), "sex".getBytes(), CompareOp.EQUAL, "女".getBytes()));
// filterList.addFilter(new SingleColumnValueFilter("s2".getBytes(), "name".getBytes(), CompareOp.EQUAL, "美女".getBytes()));
filterList.addFilter(new FirstKeyOnlyFilter());
s1.setFilter(filterList);
ResultScanner ResultScannerFilterList = table.getScanner(s1);
for(Result rr=ResultScannerFilterList.next();rr!=null;rr=ResultScannerFilterList.next()){
for(KeyValue kv:rr.list()){
System.out.println(kv.getTimestamp()+":"+kv.getTotalColumnLength());
System.out.println("row : "+Long.parseLong(new String(kv.getBuffer(),kv.getRowOffset(),kv.getRowLength())));
System.out.println("column : "+new String(kv.getQualifier()));
System.out.println("value : "+new String(kv.getValue()));
}
}
table.close();
}
将注释fileter打开则查询到2条,反之则是1条记录。
求教!!!
问题补充:select写错了。补充下。
FilterList filterList = new FilterList(Operator.MUST_PASS_ALL);
2013年5月09日 15:55
目前还没有答案
相关推荐
HBase过滤器允许我们在读取数据时对结果进行筛选,减少不必要的I/O操作,从而提高效率。它们是通过实现`Filter`接口来定义的,并在扫描器(Scanner)执行时应用。HBase提供了多种内置过滤器,如...
Hbase过滤器详解,基础篇
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个...
HBase过滤器可以根据条件过滤数据。例如,使用RowFilter过滤器来过滤Student表中的数据: scan 'Student', FILTER => "RowFilter(=, 'binary:0001')" HBase行键过滤器 ------------------ HBase行键过滤器用于...
在Java中操作HBase,过滤数据是至关重要的任务,特别是在处理大数据时,高效地筛选出所需信息能够极大地提升性能。本文将深入探讨HBase的比较过滤器RowFilter的使用源码,帮助你理解如何在实际项目中应用这一关键...
HBase提供了多种过滤器机制,其中PageFilter是一种非常实用的工具,它可以帮助我们在查询时限制返回的结果数量,从而优化性能和内存使用。下面我们将深入探讨PageFilter的使用方法,并通过源代码示例来解释其工作...
#### HBase过滤器 - **ColumnPrefixFilter**:介绍如何使用ColumnPrefixFilter来根据列前缀筛选数据。这种过滤器适用于当需要基于列名前缀来检索数据的场景。 - **FamilyFilter**:讲解FamilyFilter的使用方法,这...
`HbaseCusFilter.java`文件可能包含自定义的HBase过滤器,这是HBase查询机制的一个重要部分。通过继承HBase的Filter接口,我们可以编写自己的过滤逻辑,以实现更复杂的查询需求。 `App.java`可能是主应用程序类,它...
HBase过滤器可以增强HBase查询数据的功能,减少服务端返回给客户端的数据量。过滤器的父类有比较过滤器、专用过滤器等。 MapReduce掌握情况 MapReduce掌握情况可以通过测试MapReduce掌握情况和Hive的QL语言掌握...
通过对HBase的使用注意事项进行深入分析,我们了解到在表设计阶段应当重视RowKey的设计及其对数据分布的影响,同时还需要考虑压缩算法、过滤器的选择以及版本控制等因素。此外,对于Java API的使用也需要注意资源...
3. 查询数据:`get '表名', '行键'`获取整行数据,或`scan '表名'`进行全表扫描,可以指定过滤器等条件。 4. 删除数据:`delete '表名', '行键', '列族:列限定符', [时间戳]`删除特定单元格,可选时间戳指定版本。 ...
Filter是HBase中的一种过滤器,用于过滤查询结果。在本文中,作者使用了FirstKeyOnlyFilter和SingleColumnValueFilter来实现分页查询。 知识点7:ResultScanner的使用 ResultScanner是HBase中的一种结果扫描器,...
3. **配置HBase**:编辑`conf/hbase-site.xml`,设置HBase的主配置,如`hbase.rootdir`(HDFS中的HBase目录)和`hbase.zookeeper.quorum`(Zookeeper集群地址)。 4. **启动与停止**:使用`start-hbase.sh`启动HBase...
在实际开发中,你可能还需要处理异常、实现更复杂的查询逻辑、使用过滤器或者与其他系统集成。理解HBase的表结构、行键设计、列族和时间戳等概念对于有效地使用Scala API操作HBase至关重要。同时,熟悉HBase的...
4. **HBase的过滤器机制**:过滤器是HBase查询性能优化的关键。通过使用行过滤器、列过滤器、时间戳过滤器等,可以在服务器端提前过滤掉不需要的数据,减少网络传输和客户端处理的压力。 5. **HBase的MapReduce支持...
另外,hbase-common-2.2.4.jar包含了HBase的公共库,如元数据管理、行键设计、过滤器实现等,是HBase操作的基础。而hadoop-mapreduce-client-common-3.1.3.jar则是Hadoop MapReduce的通用客户端库,提供了与...