分享

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

pig2 2014-8-23 20:09:44 发表于 实操演练 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 103630
本帖最后由 pig2 于 2017-3-3 17:00 编辑

问题导读:
1.如何根据rowkey模糊查询?
2.如何使用Comparator过滤rowkey?
3.如何查询rowkey中包含有某字符串的数据?





RowFilter用于过滤row key
OperatorDescription
LESS小于
LESS_OR_EQUAL小于等于
[EQUAL等于
NOT_EQUAL不等于
GREATER_OR_EQUAL大于等于
GREATER大于
NO_OP排除所有

ComparatorDescription
BinaryComparator使用Bytes.compareTo()比较
BinaryPrefixComparator和BinaryComparator差不多,从前面开始比较
NullComparatorDoes not compare against an actual value but whether a given one is null, or not  null.
BitComparatorPerforms 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.          * 部分代码来自hbase权威指南
  24.          * @throws IOException
  25.          */
  26.         public void testRowFilter() throws IOException {
  27.                 HTable table = new HTable(config, tableName);
  28.                 Scan scan = new Scan();
  29.                 System.out.println("小于等于row010的行");
  30.                 Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
  31.                                 new BinaryComparator("row010".getBytes()));
  32.                 scan.setFilter(filter1);
  33.                 ResultScanner scanner1 = table.getScanner(scan);
  34.                 for (Result res : scanner1) {
  35.                         System.out.println(res);
  36.                 }
  37.                 scanner1.close();
  38.                 System.out.println("正则获取结尾为5的行");
  39.                 Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL,
  40.                                 new RegexStringComparator(".*5));
  41.                 scan.setFilter(filter2);
  42.                 ResultScanner scanner2 = table.getScanner(scan);
  43.                 for (Result res : scanner2) {
  44.                         System.out.println(res);
  45.                 }
  46.                 scanner2.close();
  47.                 System.out.println("包含有5的行");
  48.                 Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,
  49.                                 new SubstringComparator("5"));
  50.                 scan.setFilter(filter3);
  51.                 ResultScanner scanner3 = table.getScanner(scan);
  52.                 for (Result res : scanner3) {
  53.                         System.out.println(res);
  54.                 }
  55.                 scanner3.close();
  56.                 System.out.println("开头是row01的");
  57.                 Filter filter4 = new RowFilter(CompareFilter.CompareOp.EQUAL,
  58.                                 new BinaryPrefixComparator("row01".getBytes()));
  59.                 scan.setFilter(filter4);
  60.                 ResultScanner scanner4 = table.getScanner(scan);
  61.                 for (Result res : scanner4) {
  62.                         System.out.println(res);
  63.                 }
  64.                 scanner3.close();
  65.         }
  66.         /**
  67.          * 初始化数据
  68.          */
  69.         public void init() {
  70.                 // 创建表和初始化数据
  71.                 try {
  72.                         HBaseAdmin admin = new HBaseAdmin(config);
  73.                         if (!admin.tableExists(tableName)) {
  74.                                 HTableDescriptor htd = new HTableDescriptor(tableName);
  75.                                 HColumnDescriptor hcd1 = new HColumnDescriptor("data");
  76.                                 htd.addFamily(hcd1);
  77.                                 HColumnDescriptor hcd2 = new HColumnDescriptor("url");
  78.                                 htd.addFamily(hcd2);
  79.                                 admin.createTable(htd);
  80.                         }
  81.                         HTable table = new HTable(config, tableName);
  82.                         table.setAutoFlush(false);
  83.                         int count = 50;
  84.                         for (int i = 1; i <= count; ++i) {
  85.                                 Put p = new Put(String.format("row%03d", i).getBytes());
  86.                                 p.add("data".getBytes(), String.format("col%01d", i % 10)
  87.                                                 .getBytes(), String.format("data%03d", i).getBytes());
  88.                                 p.add("url".getBytes(), String.format("col%01d", i % 10)
  89.                                                 .getBytes(), String.format("url%03d", i).getBytes());
  90.                                 table.put(p);
  91.                         }
  92.                         table.close();
  93.                 } catch (IOException e) {
  94.                         e.printStackTrace();
  95.                 }
  96.         }
  97.         /**
  98.          * @param args
  99.          * @throws IOException
  100.          */
  101.         public static void main(String[] args) throws IOException {
  102.                 TestHbaseRowFilter test = new TestHbaseRowFilter();
  103.                 test.init();
  104.                 test.testRowFilter();
  105.         }
  106. }
复制代码

输出结果
  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}
复制代码






已有(6)人评论

跳转到指定楼层
lyman825726 发表于 2014-8-24 12:14:59
不错,值得学习
回复

使用道具 举报

UFO 发表于 2016-4-12 15:36:59
请问版主一个问题,hbase的RowKey如果是有序的,不是会造成写热点问题吗,但如果rowkey是随机无序的,那怎么根据filter来过滤,在查的时候又是怎么查RowKey对应的region?
回复

使用道具 举报

easthome001 发表于 2017-3-3 16:57:50
UFO 发表于 2016-4-12 15:36
请问版主一个问题,hbase的RowKey如果是有序的,不是会造成写热点问题吗,但如果rowkey是随机无序的,那怎 ...

参考这个
hbase hash散列后 如何scan 查询?
http://www.aboutyun.com/forum.php?mod=viewthread&tid=21143


回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条