问题导读:
1.如何根据rowkey模糊查询?
2.如何使用Comparator过滤rowkey?
3.如何查询rowkey中包含有某字符串的数据?
RowFilter用于过滤row key
Operator | Description |
LESS | 小于 |
LESS_OR_EQUAL | 小于等于 |
[EQUAL | 等于 |
NOT_EQUAL | 不等于 |
GREATER_OR_EQUAL | 大于等于 |
GREATER | 大于 |
NO_OP | 排除所有 |
Comparator | Description |
BinaryComparator | 使用Bytes.compareTo()比较 |
BinaryPrefixComparator | 和BinaryComparator差不多,从前面开始比较 |
NullComparator | Does not compare against an actual value but whether a given one is null, or not null. |
BitComparator | Performs a bitwise comparison, providing a BitwiseOp class with OR, and XOR operators. |
RegexStringComparator | 正则表达式 |
SubstringComparator | 把数据当成字符串,用contains()来判断 |
- import java.io.IOException;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.HColumnDescriptor;
- import org.apache.hadoop.hbase.HTableDescriptor;
- import org.apache.hadoop.hbase.client.HBaseAdmin;
- import org.apache.hadoop.hbase.client.HTable;
- import org.apache.hadoop.hbase.client.Put;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.filter.BinaryComparator;
- import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
- import org.apache.hadoop.hbase.filter.CompareFilter;
- import org.apache.hadoop.hbase.filter.Filter;
- import org.apache.hadoop.hbase.filter.RegexStringComparator;
- import org.apache.hadoop.hbase.filter.RowFilter;
- import org.apache.hadoop.hbase.filter.SubstringComparator;
- public class TestHbaseRowFilter {
- String tableName = "test_row_filter";
- Configuration config = HBaseConfiguration.create();
- public void testRowFilter() throws IOException {
- HTable table = new HTable(config, tableName);
- Scan scan = new Scan();
- System.out.println("小于等于row010的行");
- Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
- new BinaryComparator("row010".getBytes()));
- scan.setFilter(filter1);
- ResultScanner scanner1 = table.getScanner(scan);
- for (Result res : scanner1) {
- System.out.println(res);
- }
- scanner1.close();
- System.out.println("正则获取结尾为5的行");
- Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL,
- new RegexStringComparator(".*5[ DISCUZ_CODE_0 ]quot;));
- scan.setFilter(filter2);
- ResultScanner scanner2 = table.getScanner(scan);
- for (Result res : scanner2) {
- System.out.println(res);
- }
- scanner2.close();
- System.out.println("包含有5的行");
- Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,
- new SubstringComparator("5"));
- scan.setFilter(filter3);
- ResultScanner scanner3 = table.getScanner(scan);
- for (Result res : scanner3) {
- System.out.println(res);
- }
- scanner3.close();
- System.out.println("开头是row01的");
- Filter filter4 = new RowFilter(CompareFilter.CompareOp.EQUAL,
- new BinaryPrefixComparator("row01".getBytes()));
- scan.setFilter(filter4);
- ResultScanner scanner4 = table.getScanner(scan);
- for (Result res : scanner4) {
- System.out.println(res);
- }
- scanner3.close();
- }
- public void init() {
- // 创建表和初始化数据
- try {
- HBaseAdmin admin = new HBaseAdmin(config);
- if (!admin.tableExists(tableName)) {
- HTableDescriptor htd = new HTableDescriptor(tableName);
- HColumnDescriptor hcd1 = new HColumnDescriptor("data");
- htd.addFamily(hcd1);
- HColumnDescriptor hcd2 = new HColumnDescriptor("url");
- htd.addFamily(hcd2);
- admin.createTable(htd);
- }
- HTable table = new HTable(config, tableName);
- table.setAutoFlush(false);
- int count = 50;
- for (int i = 1; i <= count; ++i) {
- Put p = new Put(String.format("rowd", i).getBytes());
- p.add("data".getBytes(), String.format("cold", i % 10)
- .getBytes(), String.format("datad", i).getBytes());
- p.add("url".getBytes(), String.format("cold", i % 10)
- .getBytes(), String.format("urld", i).getBytes());
- table.put(p);
- }
- table.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws IOException {
- TestHbaseRowFilter test = new TestHbaseRowFilter();
- test.init();
- test.testRowFilter();
- }
- }
输出结果
- 小于等于row010的行
- keyvalues={row001/data:col1/1364133382268/Put/vlen=7, row001/url:col1/1364133382268/Put/vlen=6}
- keyvalues={row002/data:col2/1364133382268/Put/vlen=7, row002/url:col2/1364133382268/Put/vlen=6}
- keyvalues={row003/data:col3/1364133382268/Put/vlen=7, row003/url:col3/1364133382268/Put/vlen=6}
- keyvalues={row004/data:col4/1364133382268/Put/vlen=7, row004/url:col4/1364133382268/Put/vlen=6}
- keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row006/data:col6/1364133382268/Put/vlen=7, row006/url:col6/1364133382268/Put/vlen=6}
- keyvalues={row007/data:col7/1364133382268/Put/vlen=7, row007/url:col7/1364133382268/Put/vlen=6}
- keyvalues={row008/data:col8/1364133382268/Put/vlen=7, row008/url:col8/1364133382268/Put/vlen=6}
- keyvalues={row009/data:col9/1364133382268/Put/vlen=7, row009/url:col9/1364133382268/Put/vlen=6}
- keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6}
- 正则获取结尾为5的行
- keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6}
- 包行有5的行
- keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row050/data:col0/1364133382268/Put/vlen=7, row050/url:col0/1364133382268/Put/vlen=6}
- 开头是row01的
- keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6}
- keyvalues={row011/data:col1/1364133382268/Put/vlen=7, row011/url:col1/1364133382268/Put/vlen=6}
- keyvalues={row012/data:col2/1364133382268/Put/vlen=7, row012/url:col2/1364133382268/Put/vlen=6}
- keyvalues={row013/data:col3/1364133382268/Put/vlen=7, row013/url:col3/1364133382268/Put/vlen=6}
- keyvalues={row014/data:col4/1364133382268/Put/vlen=7, row014/url:col4/1364133382268/Put/vlen=6}
- keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
- keyvalues={row016/data:col6/1364133382268/Put/vlen=7, row016/url:col6/1364133382268/Put/vlen=6}
- keyvalues={row017/data:col7/1364133382268/Put/vlen=7, row017/url:col7/1364133382268/Put/vlen=6}
- keyvalues={row018/data:col8/1364133382268/Put/vlen=7, row018/url:col8/1364133382268/Put/vlen=6}
- keyvalues={row019/data:col9/1364133382268/Put/vlen=7, row019/url:col9/1364133382268/Put/vlen=6}
http://blog.sina.com.cn/s/blog_68674da70102v6q4.html
相关推荐
由于HBase是通过Rowkey查询的,⼀般Rowkey上都会存⼀些⽐较关键的检索信息,我们需要提前想好数据具体需要如何查询,根据查询 ⽅式进⾏数据存储格式的设计,要避免做全表扫描,因为效率特别低。 此外易观⽅⾈也使⽤...
HBASE的使用跟业务逻辑有很强的关联性,就像本文里提到的例子使用ElasticSearch更合适。...本文主要内容是通过合理hbase行键(rowkey)设计实现快速的多条件查询,所采用的方法将所有要用于查询中的列经过一些处理后
HBASE调优 HBASE技术框架与存储模型 v HBASE调优 v 硬件 v 系统参数 v java v 表的设计 v 客户端 v 服务器端
HBase-RowKey与索引设计(高清) HBase-RowKey与索引设计(高清)HBase-RowKey与索引设计(高清)
该文档是介绍hbase的rowkey设计与hbase的协处理器运用,与大家分享!
HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...
用户历史订单列表查询rowkey设计技巧 最左前缀原则
Spark存储数据到HBase实现RowKey完全散列-多进程多线程间Random完全随机,完美解决热点问题
"大数据性能调优之HBase的RowKey设计" 大数据功能调优之HBase的RowKey设计是指在HBase中对RowKey的设计,以提高HBase的性能和可扩展性。RowKey是HBase中的一种二进制码流,可以是任意字符串,最大长度为64kb,但...
java操作Hbase之比较过滤器RowFilter的使用源码,附带所需全部jar包,欢迎下载学习。
下面是一个使用Java语言实现HBase分页查询的示例代码: 首先,我们需要创建一个HBase配置对象: ```java private static Configuration config = null; private static HTablePool tp = null; static { config = ...
阿里云 吴阳平(明惠) 阿里云HBase业务架构师 主要章节:
下面是实现HBase分页查询的代码实现: 首先,我们需要创建一个HBase的配置对象,指定ZooKeeper的地址和端口号。 ```java private static Configuration config = null; private static HTablePool tp = null; ...
因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费资源较大,查询效率较低。类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了...
2-2+HBase-RowKey+与索引设计
springboot搭建的hbase可视化界面 支持hbase的建表与删除 支持根据rowkey查询数据
因为上传文件大小控制原因,不能把项目完整的上传,上传了主要的代码类和页面,自己把依赖包嵌进来即可
HBase原理及实例
本代码是java链接并操作hbase的实例代码,原本供同事参考所用,引用的jar包并没有经过详细分析,可能有冗余。