[Hbase]Hbase的过滤器分类

桃扇骨 2022-05-08 00:10 288阅读 0赞

Hbase的过滤器分类

1、比较过滤器

1.1、行键过滤器RowFilter

  1. Filter filter1 = new RowFilter(CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row-22")));
  2. scan.setFilter(filter1);

1.2、列族过滤器FamilyFilter

  1. Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("colfam3")));
  2. scan.setFilter(filter1);

1.3、列过滤器QualifierFilter

  1. filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("col-2")));
  2. scan.setFilter(filter1);

1.4、值过滤器ValueFilter

  1. Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(".4") );
  2. scan.setFilter(filter1);

2、专用过滤器

2.1、单列值过滤器SingleColumnValueFilter

返回满足条件的整行

  1. SingleColumnValueFilter filter = new SingleColumnValueFilter(
  2. Bytes.toBytes("colfam1"),
  3. Bytes.toBytes("col-5"),
  4. CompareFilter.CompareOp.NOT_EQUAL,
  5. new SubstringComparator("val-5"));
  6. filter.setFilterIfMissing(true); //如果不设置为true,则那些不包含指定column的行也会返回
  7. scan.setFilter(filter1);

2.2、SingleColumnValueExcludeFilter与SingleColumnValueFilter相反

2.3、前缀过滤器PrefixFilter

针对行键

  1. Filter filter = new PrefixFilter(Bytes.toBytes("row1"));
  2. scan.setFilter(filter1);

2.4、列前缀过滤器ColumnPrefixFilter

  1. Filter filter = new ColumnPrefixFilter(Bytes.toBytes("qual2"));
  2. scan.setFilter(filter1);

2.5、分页过滤器PageFilter

  1. public static void main(String[] args) throws Exception {
  2. Configuration conf = HBaseConfiguration.create();
  3. conf.set("hbase.zookeeper.quorum", "spark01:2181,spark02:2181,spark03:2181");
  4. String tableName = "testfilter";
  5. String cfName = "f1";
  6. final byte[] POSTFIX = new byte[] { 0x00 };
  7. HTable table = new HTable(conf, tableName);
  8. Filter filter = new PageFilter(3);
  9. byte[] lastRow = null;
  10. int totalRows = 0;
  11. while (true) {
  12. Scan scan = new Scan();
  13. scan.setFilter(filter);
  14. if(lastRow != null){
  15. //注意这里添加了POSTFIX操作,用来重置扫描边界
  16. byte[] startRow = Bytes.add(lastRow,POSTFIX);
  17. scan.setStartRow(startRow);
  18. }
  19. ResultScanner scanner = table.getScanner(scan);
  20. int localRows = 0;
  21. Result result;
  22. while((result = scanner.next()) != null){
  23. System.out.println(localRows++ + ":" + result);
  24. totalRows ++;
  25. lastRow = result.getRow();
  26. }
  27. scanner.close();
  28. if(localRows == 0) break;
  29. }
  30. System.out.println("total rows:" + totalRows);
  31. }

3、多种过滤条件使用

  1. /**
  2. * 多种过滤条件的使用方法
  3. * @throws Exception
  4. */
  5. @Test
  6. public void testScan() throws Exception{
  7. HTable table = new HTable(conf, "person_info".getBytes());
  8. Scan scan = new Scan(Bytes.toBytes("person_rk_bj_zhang_000001"), Bytes.toBytes("person_rk_bj_zhang_000002"));
  9. //前缀过滤器----针对行键
  10. Filter filter = new PrefixFilter(Bytes.toBytes("rk"));
  11. //行过滤器 ---针对行键
  12. ByteArrayComparable rowComparator = new BinaryComparator(Bytes.toBytes("person_rk_bj_zhang_000001"));
  13. RowFilter rf = new RowFilter(CompareOp.LESS_OR_EQUAL, rowComparator);
  14. /**
  15. * 假设rowkey格式为:创建日期_发布日期_ID_TITLE
  16. * 目标:查找 发布日期 为 2014-12-21 的数据
  17. */
  18. rf = new RowFilter(CompareOp.EQUAL , new SubstringComparator("_2014-12-21_"));
  19. //单值过滤器1完整匹配字节数组
  20. new SingleColumnValueFilter("base_info".getBytes(), "name".getBytes(), CompareOp.EQUAL, "zhangsan".getBytes());
  21. //单值过滤器2 匹配正则表达式
  22. ByteArrayComparable comparator = new RegexStringComparator("zhang.");
  23. new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);
  24. //单值过滤器3匹配是否包含子串,大小写不敏感
  25. comparator = new SubstringComparator("wu");
  26. new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);
  27. //键值对元数据过滤-----family过滤----字节数组完整匹配
  28. FamilyFilter ff = new FamilyFilter(
  29. CompareOp.EQUAL ,
  30. new BinaryComparator(Bytes.toBytes("base_info")) //表中不存在inf列族,过滤结果为空
  31. );
  32. //键值对元数据过滤-----family过滤----字节数组前缀匹配
  33. ff = new FamilyFilter(
  34. CompareOp.EQUAL ,
  35. new BinaryPrefixComparator(Bytes.toBytes("inf")) //表中存在以inf打头的列族info,过滤结果为该列族所有行
  36. );
  37. //键值对元数据过滤-----qualifier过滤----字节数组完整匹配
  38. filter = new QualifierFilter(
  39. CompareOp.EQUAL ,
  40. new BinaryComparator(Bytes.toBytes("na")) //表中不存在na列,过滤结果为空
  41. );
  42. filter = new QualifierFilter(
  43. CompareOp.EQUAL ,
  44. new BinaryPrefixComparator(Bytes.toBytes("na")) //表中存在以na打头的列name,过滤结果为所有行的该列数据
  45. );
  46. //基于列名(即Qualifier)前缀过滤数据的ColumnPrefixFilter
  47. filter = new ColumnPrefixFilter("na".getBytes());
  48. //基于列名(即Qualifier)多个前缀过滤数据的MultipleColumnPrefixFilter
  49. byte[][] prefixes = new byte[][] {Bytes.toBytes("na"), Bytes.toBytes("me")};
  50. filter = new MultipleColumnPrefixFilter(prefixes);
  51. //为查询设置过滤条件
  52. scan.setFilter(filter);
  53. scan.addFamily(Bytes.toBytes("base_info"));
  54. //一行
  55. // Result result = table.get(get);
  56. //多行的数据
  57. ResultScanner scanner = table.getScanner(scan);
  58. for(Result r : scanner){
  59. /**
  60. for(KeyValue kv : r.list()){
  61. String family = new String(kv.getFamily());
  62. System.out.println(family);
  63. String qualifier = new String(kv.getQualifier());
  64. System.out.println(qualifier);
  65. System.out.println(new String(kv.getValue()));
  66. }
  67. */
  68. //直接从result中取到某个特定的value
  69. byte[] value = r.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"));
  70. System.out.println(new String(value));
  71. }
  72. table.close();
  73. }

发表评论

表情:
评论列表 (有 0 条评论,288人围观)

还没有评论,来说两句吧...

相关阅读