Hbase过滤器

mac2024-05-10  36

Hbase的过滤器

1 、SingleColumnValueFilter

/** * 高级查询 * 过滤器链查询 */ public class Demo6_Filter {   /**     * 需求:     * select * from ns1_userinfo where age <= 18 and name = narudo     */   @Test   public void listFilter() throws IOException {       /*         * 1. 创建过滤器链         * and条件使用MUST_PASS_ALL作为条件         * or条件使用MUST_PASS_ONE         */       FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);       /*         * 2. 构造查询条件         * 对于单列值比较器使用SingleColumnValueFilter         * ColumnFamily, qualifier, 比较过滤器(大于、小于、等于、...), value         */       SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("age"),               CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("18"));       SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),               CompareFilter.CompareOp.EQUAL, Bytes.toBytes("narudo"));       /*         * 3. 将条件加入到过滤器链中         */       filterList.addFilter(ageFilter);       filterList.addFilter(nameFilter);       //4.创建扫描器进行扫描       Scan scan = new Scan();       //5. 将过滤条件关联到扫描器       scan.setFilter(filterList);       //6. 获取表对象       Table table = HBaseUtils.getTable();       //7. 扫描表       ResultScanner scanner = table.getScanner(scan);       //8. 打印数据       Iterator<Result> iterator = scanner.iterator();       while (iterator.hasNext()) {           Result result = iterator.next();           HBaseUtils.showResult(result);       }   } }

 说明在查询的时候 

1. 这种查询如果对应的行键,如果都包含了age和name列,就会对比值,如果都不满足就将其过滤,如果满足就获取。 2. 如果包含其中也给值,name或者age,只要其中一个列满足条件就会,就会获取。 3. 如果name和age都没有,那么视为该行满足条件

 解决方案 

在某个单值过滤器总添加 ageFilter.setFilterIfMissing(true); nameFilter.setFilterIfMissing(true);

2、 比较器

2.1、RegexStringComparator

/**     *     * 测试正则比较器     * 需求:select * from ns1_userinfo where name like '%i%'     */   @Test   public void regexStringComparatorTest() throws IOException {       //1. 创建比较器,正则:以li开头的       RegexStringComparator regexStringComparator = new RegexStringComparator("[$a-z]i[$a-z]");       //2. 获取单列值过滤器       SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),               CompareFilter.CompareOp.EQUAL, regexStringComparator);       //3. 设置缺失       nameFilter.setFilterIfMissing(true);       //4.创建扫描器进行扫描       Scan scan = new Scan();       //5. 设置过滤器       scan.setFilter(nameFilter);       //6. 获取表对象       Table table = HBaseUtils.getTable();       //7. 扫描表       ResultScanner scanner = table.getScanner(scan);       //8. 打印数据       Iterator<Result> iterator = scanner.iterator();       while (iterator.hasNext()) {           Result result = iterator.next();           HBaseUtils.showResult(result);       }   }

封装HbaseUtils

/** * 显示这个过滤器扫描的对象 */ public static void showFilterResult(Filter filter) {   //4.创建扫描器进行扫描   Scan scan = new Scan();   //5. 设置过滤器   scan.setFilter(filter);   //6. 获取表对象   Table table = HBaseUtils.getTable();   //7. 扫描表   ResultScanner scanner = null;   try {       scanner = table.getScanner(scan);       //8. 打印数据       Iterator<Result> iterator = scanner.iterator();       while (iterator.hasNext()) {           Result result = iterator.next();           HBaseUtils.showResult(result);       }   } catch (IOException e) {   logger.warn("获取table的时候异常!", e);   } finally {       try {       table.close();       } catch (IOException e) {       logger.warn("关闭table的时候异常!", e);       }   } } ​

修改之前的方法

/** * * 测试正则比较器 * 需求:select * from ns1_userinfo where name like '%i%' */ @Test public void regexStringComparatorTest() throws IOException {   //1. 创建比较器,正则:以li开头的   RegexStringComparator regexStringComparator = new RegexStringComparator("[$a-z]i[$a-z]");   //2. 获取单列值过滤器   SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),   CompareFilter.CompareOp.EQUAL, regexStringComparator);   //3. 设置缺失   nameFilter.setFilterIfMissing(true);   //4. 打印   HBaseUtils.showFilterResult(nameFilter); }

2.2、subStringComparator

/** * * 测试subString比较器 * 需求:select * from ns1_userinfo where name like '%i%' */ @Test public void subStringComparatorTest() throws IOException {   //1. 创建比较器,正则:以li开头的   SubstringComparator substringComparator = new SubstringComparator("i");   //2. 获取单列值过滤器   SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),   CompareFilter.CompareOp.EQUAL, substringComparator);   //3. 设置缺失   nameFilter.setFilterIfMissing(true);   //4. 打印   HBaseUtils.showFilterResult(nameFilter); }

2.3、BinaryComparator

/** * * 测试二进制比较器 * 需求:select * from ns1_userinfo where name = 'lixi' */ @Test public void binaryComparatorTest() throws IOException {   //1. 创建比较器,正则:以li开头的   BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("lixi"));   //2. 获取单列值过滤器   SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),   CompareFilter.CompareOp.EQUAL, binaryComparator);   //3. 设置缺失   nameFilter.setFilterIfMissing(true);   //4. 打印   HBaseUtils.showFilterResult(nameFilter); }

2.4、BinaryPrefixComparator

/** * * 测试二进制前缀比较器 * 需求:select * from ns1_userinfo where name like 'li%' */ @Test public void binaryPrefixComparatorTest() throws IOException {   //1. 创建比较器,正则:以li开头的   BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("li"));   //2. 获取单列值过滤器   SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),   CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);   //3. 设置缺失   nameFilter.setFilterIfMissing(true);   //4. 打印   HBaseUtils.showFilterResult(nameFilter); } ​

3 、KeyValue Metadata

3.1、FamilyFilter1

/** * 查询以base开头的列簇 */ @Test public void testColumnFamily1() {   //1. 创建正则比较器:以base开头的字符串   RegexStringComparator regexStringComparator = new RegexStringComparator("^base");   //2. 创建FamilyFilter:结果中只包含满足条件的列簇信息   FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, regexStringComparator);   //3. 打印   HBaseUtils.showFilterResult(familyFilter); } ​

3.2、FamilyFilter2

/** * 查询包含xtr的列簇 */ @Test public void testColumnFamily2() {   //1. 创建正则比较器:以base开头的字符串   SubstringComparator substringComparator = new SubstringComparator("xtr");   //2. 创建FamilyFilter   FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, substringComparator);   //3. 打印   HBaseUtils.showFilterResult(familyFilter); }

3.3、QualifierFilter

/** * 查询包含xtr的列簇 */ @Test public void testQualifierFilter() {   //1. 创建正则比较器:以base开头的字符串   SubstringComparator substringComparator = new SubstringComparator("am");   //2. 创建FamilyFilter   QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, substringComparator);   //3. 打印   HBaseUtils.showFilterResult(qualifierFilter); }

3.4、ColumnPrefixFilter

/** * 查询包含xtr的列簇 */ @Test public void testColumnPrefixFilter() {   //1. 创建ColumnPrefixFilter   ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter(Bytes.toBytes("a"));   //2. 打印   HBaseUtils.showFilterResult(columnPrefixFilter); }

3.5、MultipleColumnPrefixFilter

/** * 查找以“a”或“n”开头的行和列族中的所有列 */ @Test public void testMultipleColumnPrefixFilter() {   //1. 创建ColumnPrefixFilter   byte[][] prefixes = new byte[][] {Bytes.toBytes("a"), Bytes.toBytes("n")};   MultipleColumnPrefixFilter multipleColumnPrefixFilter = new MultipleColumnPrefixFilter(prefixes);   //2. 打印   HBaseUtils.showFilterResult(multipleColumnPrefixFilter); }

3.6、ColumnRangeFilter

/** * 查找以“age”到“name”的列的信息 * minColumnInclusive:true为包含,false为不包含 */ @Test public void testColumnRangeFilter() {   //1. 创建ColumnPrefixFilter   ColumnRangeFilter columnRangeFilter = new ColumnRangeFilter(Bytes.toBytes("age"), false,   Bytes.toBytes("name"), true);   //2. 打印   HBaseUtils.showFilterResult(columnRangeFilter); }

4 、RowKey

RowFilter

/** * 查找rowkey=002的信息 */ @Test public void testRowFilter() {   //1. 创建RowFilter   BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("002"));   RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryComparator);   //2. 打印   HBaseUtils.showFilterResult(rowFilter); }

5 、Utility

FirstKeyOnlyFilter

/** * 查找指定表中的所有的行键的第一个列 */ @Test public void testFirstKeyOnlyFilter() {   //1. 创建RowFilter   FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();   //2. 打印   HBaseUtils.showFilterResult(firstKeyOnlyFilter); } ​

最后举例

/** * 需求:select * from ns1_userinfo where age <= 18 or name = lixi */ @Test public void listFilter2() {   //1.   FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);   SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("age"),   CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("18"));   SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),   CompareFilter.CompareOp.EQUAL, Bytes.toBytes("lixi"));   ageFilter.setFilterIfMissing(true);   nameFilter.setFilterIfMissing(true);   filterList.addFilter(ageFilter);   filterList.addFilter(nameFilter);   List<Filter> filters = filterList.getFilters();   for(Filter filter : filters) {   HBaseUtils.showFilterResult(filter);   } }

6 、PageFilter

/** * 需求:每行显示3条记录 * 将全部的数据分页显示出来 * * 思路: * 1. 第一页: * select * from user_info where rowkey > \001 limit 3; * 2. 其他页 * select * from user_info where rowkey > 第一页的maxrowkey limit 3; * 3. 循环什么时候结束? * while(true) { *     select * from user_info where rowkey > 第一页的maxrowkey limit 3; *     print 3行数据 *     结束条件:count<3 * } */ public class Demo7_PageFilter { ​   /**     * 测试分页显示user_info表中的所有数据,分页显示为3行记录     */   @Test   public void testPageFilter() throws IOException {       //1. 创建分页过滤器,并设置每页显示3条记录       PageFilter pageFilter = new PageFilter(3);       //2. 构造扫描器       Scan scan = new Scan();       //3. 给扫描器设置过滤器       scan.setFilter(pageFilter);       //4. 获取表的管理器       Table table = HBaseUtils.getTable();       //5. 遍历显示       String maxKey = ""; // 最大key值记录器       while(true) {           int count = 0; // 计算器           //6. 获取结构扫描器           ResultScanner scanner = table.getScanner(scan);           //7. 获取迭代器迭代           Iterator<Result> iterator = scanner.iterator();           //8. 迭代           while (iterator.hasNext()) {               Result result = iterator.next();               System.out.println(new String(result.getRow()));               count++;               maxKey = Bytes.toString(result.getRow());               //9. 打印               HBaseUtils.showResult(result);           }           System.out.println("------------------------------------");           //10. 判断是否可以结束·           if (count < 3) break; ​           //11. 设置下一次开始查询的行键号           scan.setStartRow(Bytes.toBytes(maxKey + "\001"));       }   } }

 

最新回复(0)