`

hbase RowFilter如何根据rowkey查询以及实例实现代码

阅读更多

问题导读:
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()来判断

 

  1. import java.io.IOException;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.HColumnDescriptor;
  5. import org.apache.hadoop.hbase.HTableDescriptor;
  6. import org.apache.hadoop.hbase.client.HBaseAdmin;
  7. import org.apache.hadoop.hbase.client.HTable;
  8. import org.apache.hadoop.hbase.client.Put;
  9. import org.apache.hadoop.hbase.client.Result;
  10. import org.apache.hadoop.hbase.client.ResultScanner;
  11. import org.apache.hadoop.hbase.client.Scan;
  12. import org.apache.hadoop.hbase.filter.BinaryComparator;
  13. import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
  14. import org.apache.hadoop.hbase.filter.CompareFilter;
  15. import org.apache.hadoop.hbase.filter.Filter;
  16. import org.apache.hadoop.hbase.filter.RegexStringComparator;
  17. import org.apache.hadoop.hbase.filter.RowFilter;
  18. import org.apache.hadoop.hbase.filter.SubstringComparator;
  19. public class TestHbaseRowFilter {
  20.         String tableName = "test_row_filter";
  21.         Configuration config = HBaseConfiguration.create();
  22.         
  23.         public void testRowFilter() throws IOException {
  24.                 HTable table = new HTable(config, tableName);
  25.                 Scan scan = new Scan();
  26.                 System.out.println("小于等于row010的行");
  27.                 Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
  28.                                 new BinaryComparator("row010".getBytes()));
  29.                 scan.setFilter(filter1);
  30.                 ResultScanner scanner1 = table.getScanner(scan);
  31.                 for (Result res : scanner1) {
  32.                         System.out.println(res);
  33.                 }
  34.                 scanner1.close();
  35.                 System.out.println("正则获取结尾为5的行");
  36.                 Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL,
  37.                                 new RegexStringComparator(".*5[        DISCUZ_CODE_0        ]quot;));
  38.                 scan.setFilter(filter2);
  39.                 ResultScanner scanner2 = table.getScanner(scan);
  40.                 for (Result res : scanner2) {
  41.                         System.out.println(res);
  42.                 }
  43.                 scanner2.close();
  44.                 System.out.println("包含有5的行");
  45.                 Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,
  46.                                 new SubstringComparator("5"));
  47.                 scan.setFilter(filter3);
  48.                 ResultScanner scanner3 = table.getScanner(scan);
  49.                 for (Result res : scanner3) {
  50.                         System.out.println(res);
  51.                 }
  52.                 scanner3.close();
  53.                 System.out.println("开头是row01的");
  54.                 Filter filter4 = new RowFilter(CompareFilter.CompareOp.EQUAL,
  55.                                 new BinaryPrefixComparator("row01".getBytes()));
  56.                 scan.setFilter(filter4);
  57.                 ResultScanner scanner4 = table.getScanner(scan);
  58.                 for (Result res : scanner4) {
  59.                         System.out.println(res);
  60.                 }
  61.                 scanner3.close();
  62.         }
  63.         
  64.         public void init() {
  65.                 // 创建表和初始化数据
  66.                 try {
  67.                         HBaseAdmin admin = new HBaseAdmin(config);
  68.                         if (!admin.tableExists(tableName)) {
  69.                                 HTableDescriptor htd = new HTableDescriptor(tableName);
  70.                                 HColumnDescriptor hcd1 = new HColumnDescriptor("data");
  71.                                 htd.addFamily(hcd1);
  72.                                 HColumnDescriptor hcd2 = new HColumnDescriptor("url");
  73.                                 htd.addFamily(hcd2);
  74.                                 admin.createTable(htd);
  75.                         }
  76.                         HTable table = new HTable(config, tableName);
  77.                         table.setAutoFlush(false);
  78.                         int count = 50;
  79.                         for (int i = 1; i <= count; ++i) {
  80.                                 Put p = new Put(String.format("rowd", i).getBytes());
  81.                                 p.add("data".getBytes(), String.format("cold", i % 10)
  82.                                                 .getBytes(), String.format("datad", i).getBytes());
  83.                                 p.add("url".getBytes(), String.format("cold", i % 10)
  84.                                                 .getBytes(), String.format("urld", i).getBytes());
  85.                                 table.put(p);
  86.                         }
  87.                         table.close();
  88.                 } catch (IOException e) {
  89.                         e.printStackTrace();
  90.                 }
  91.         }
  92.         
  93.         public static void main(String[] args) throws IOException {
  94.                 TestHbaseRowFilter test = new TestHbaseRowFilter();
  95.                 test.init();
  96.                 test.testRowFilter();
  97.         }
  98. }
复制代码
输出结果
  1. 小于等于row010的行
  2. keyvalues={row001/data:col1/1364133382268/Put/vlen=7, row001/url:col1/1364133382268/Put/vlen=6}
  3. keyvalues={row002/data:col2/1364133382268/Put/vlen=7, row002/url:col2/1364133382268/Put/vlen=6}
  4. keyvalues={row003/data:col3/1364133382268/Put/vlen=7, row003/url:col3/1364133382268/Put/vlen=6}
  5. keyvalues={row004/data:col4/1364133382268/Put/vlen=7, row004/url:col4/1364133382268/Put/vlen=6}
  6. keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
  7. keyvalues={row006/data:col6/1364133382268/Put/vlen=7, row006/url:col6/1364133382268/Put/vlen=6}
  8. keyvalues={row007/data:col7/1364133382268/Put/vlen=7, row007/url:col7/1364133382268/Put/vlen=6}
  9. keyvalues={row008/data:col8/1364133382268/Put/vlen=7, row008/url:col8/1364133382268/Put/vlen=6}
  10. keyvalues={row009/data:col9/1364133382268/Put/vlen=7, row009/url:col9/1364133382268/Put/vlen=6}
  11. keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6}
  12. 正则获取结尾为5的行
  13. keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
  14. keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
  15. keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6}
  16. keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6}
  17. keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6}
  18. 包行有5的行
  19. keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
  20. keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
  21. keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6}
  22. keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6}
  23. keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6}
  24. keyvalues={row050/data:col0/1364133382268/Put/vlen=7, row050/url:col0/1364133382268/Put/vlen=6}
  25. 开头是row01的
  26. keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6}
  27. keyvalues={row011/data:col1/1364133382268/Put/vlen=7, row011/url:col1/1364133382268/Put/vlen=6}
  28. keyvalues={row012/data:col2/1364133382268/Put/vlen=7, row012/url:col2/1364133382268/Put/vlen=6}
  29. keyvalues={row013/data:col3/1364133382268/Put/vlen=7, row013/url:col3/1364133382268/Put/vlen=6}
  30. keyvalues={row014/data:col4/1364133382268/Put/vlen=7, row014/url:col4/1364133382268/Put/vlen=6}
  31. keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
  32. keyvalues={row016/data:col6/1364133382268/Put/vlen=7, row016/url:col6/1364133382268/Put/vlen=6}
  33. keyvalues={row017/data:col7/1364133382268/Put/vlen=7, row017/url:col7/1364133382268/Put/vlen=6}
  34. keyvalues={row018/data:col8/1364133382268/Put/vlen=7, row018/url:col8/1364133382268/Put/vlen=6}
  35. 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设计方案.pdf

    其核心特性之一便是通过Rowkey进行数据查询,因此Rowkey的设计对于HBase的读写性能至关重要。Rowkey不仅需要包含关键检索信息,还要兼顾查询方式和数据存储格式,以避免全表扫描导致的效率低下。 在HBase中,...

    Hbase行键设计(rowkey)实现多条件查询

    在HBase中,行键(RowKey)的设计是至关重要的,因为它直接影响到数据的存取效率和查询性能。HBase是一种分布式、列式存储的NoSQL数据库,它以Key-Value的形式存储数据,并且主要依赖RowKey进行快速定位。由于HBase...

    HBASE调优 rowkey

    HBase是Apache软件基金会的Hadoop项目中的一个子项目,它是一个开源的非关系型分布式数据库(NoSQL),是Google Bigtable的开源实现。HBase特别适合于存储大量的稀疏数据,其设计目标是提供水平可扩展的数据存储能力...

    rowkey设计案例.zip

    "HDFSRowKey.scala"可能涉及将Hadoop的HDFS文件系统与HBase的RowKey结合,可能实现了根据HDFS文件中的数据生成RowKey的方法。这种方式可以利用文件系统中的元数据来创建RowKey,帮助实现数据的有序存储,同时利用...

    java操作Hbase之比较过滤器RowFilter的使用源码

    RowFilter是HBase提供的过滤器之一,它允许我们根据行键(row key)来过滤表中的数据。在Java API中,我们可以创建一个RowFilter实例,然后设置比较操作符和比较函数,以便根据特定条件筛选行。RowFilter的使用通常...

    hbase的rowkey设计与hbase的协处理器运用.docx

    HBase RowKey 设计与协处理器运用 HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一...

    HBase-RowKey与索引设计(高清)

    二级索引是通过在HBase中创建一个或多个额外的索引表来实现的,它可以用来优化对非RowKey字段的快速查询。组合索引则允许用户在一个索引表中索引多个字段的组合,以支持更复杂的查询需求。 在实际应用中,合理地...

    hbase分页查询实现.pdf

    HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...

    HBase分页查询的rowkey设计技巧

    用户历史订单列表查询rowkey设计技巧 最左前缀原则

    2-2+HBase-RowKey+与索引设计.zip

    本资料主要探讨了HBase中的RowKey(行键)设计以及如何利用它来实现高效的索引策略。下面我们将深入探讨这些关键概念。 **1. HBase的基本架构** HBase是基于Google Bigtable模型设计的,它将数据以表的形式存储,...

    大数据性能调优之HBase的RowKey设计.docx

    "大数据性能调优之HBase的RowKey设计" 大数据功能调优之HBase的RowKey设计是指在HBase中对RowKey的设计,以提高HBase的性能和可扩展性。RowKey是HBase中的一种二进制码流,可以是任意字符串,最大长度为64kb,但...

    hbase分页查询实现[归类].pdf

    下面是一个使用Java语言实现HBase分页查询的示例代码: 首先,我们需要创建一个HBase配置对象: ```java private static Configuration config = null; private static HTablePool tp = null; static { config = ...

    Hbase结合echart.js实例主要代码

    在压缩包中的“Hbase-echart.js主要代码”文件,应包含了实现以上步骤的关键代码片段,例如Hbase的连接、查询、数据转换以及Echart.js的配置和渲染部分。你需要将这些代码整合到你的项目中,并根据实际需求调整和...

    hbase java api 访问 查询、分页

    在HBase这个分布式列式数据库中,Java API是开发者常用的一种接口来操作HBase,包括创建表、插入数据、查询数据以及实现分页等操作。本文将深入探讨如何使用HBase Java API进行数据访问和分页查询。 首先,我们要...

    hbase用于查询客户端工具

    它不支持复杂的查询,但对于快速检查和监控HBase实例非常有用。 7. **HBase MapReduce**:MapReduce是Hadoop处理大数据的主要工具,HBase与MapReduce结合可以进行批量数据处理和分析。通过编写MapReduce作业,可以...

    基于Hbase的大数据查询优化

    因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费资源较大,查询效率较低。类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了...

    HBase MapReduce完整实例.rar

    2. **代码示例**:提供实际的Java代码,演示如何编写Map和Reduce函数来处理HBase中的数据,以及如何使用HBaseInputFormat和HBaseOutputFormat与HBase交互。 3. **数据准备**:可能包含一些模拟数据或实际数据,用于...

Global site tag (gtag.js) - Google Analytics