• hbase的api操作之过滤器


    // LESS 小于
    //LESS_OR_EQUAL 小于等于
    //EQUAL 等于
    //NOT_EQUAL 不等于
    //GREATER_OR_EQUAL 大于等于
    //GREATER 大于
    //NO_OP 排除所有

    //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 AND, OR, and XOR operators.
    // RegexStringComparator 正则表达式
    // SubstringComparator 把数据当成字符串,用contains()来判断

    //提取rowkey以包含201407的数据
    //Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("201407"));
    // 提取rowkey以01结尾数据
    // Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator(".*01$"));
    //提取rowkey以123开头的数据
    //Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("123".getBytes()));

    //组合过滤器,且满足至少一条条件

    String[] strs = new String[]{"123456", "234567"}

    List filters = new ArrayList[Filter]()
    for(String str: strs ) {
          RowFilter  filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(cookieid)))
          filters.add(filter)
    }
    FilterListfilterList = new FilterList(Operator.MUST_PASS_ONE,filters)
    /*********************************************以下是各种过滤器的用例**************************************************************/

    Comparison Filter:   对比过滤器:
        1.RowFilter
            select * from ns1:t1 where rowkey <= row100
        /**
         * 测试缓存和批处理
         */
        @Test
        public void testBatchAndCaching() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();
            scan.setCaching(2);
            scan.setBatch(4);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                System.out.println("========================================");
                //得到一行的所有map,key=f1,value=Map<Col,Map<Timestamp,value>>
                NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = r.getMap();
                //
                for (Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry : map.entrySet()) {
                    //得到列族
                    String f = Bytes.toString(entry.getKey());
                    Map<byte[], NavigableMap<Long, byte[]>> colDataMap = entry.getValue();
                    for (Map.Entry<byte[], NavigableMap<Long, byte[]>> ets : colDataMap.entrySet()) {
                        String c = Bytes.toString(ets.getKey());
                        Map<Long, byte[]> tsValueMap = ets.getValue();
                        for (Map.Entry<Long, byte[]> e : tsValueMap.entrySet()) {
                            Long ts = e.getKey();
                            String value = Bytes.toString(e.getValue());
                            System.out.print(f + "/" + c + "/" + ts + "=" + value + ",");
                        }
                    }
                }
                System.out.println();
            }
        }

        /**
         * 测试RowFilter过滤器
         */
        @Test
        public void testRowFilter() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t1");
            Scan scan = new Scan();
            RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row0100")));
            scan.setFilter(rowFilter);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                System.out.println(Bytes.toString(r.getRow()));
            }
        }

        /**
         * 测试FamilyFilter过滤器
         */
        @Test
        public void testFamilyFilter() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();
            FamilyFilter filter = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("f2")));
            scan.setFilter(filter);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                byte[] f1id = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
                byte[] f2id = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("id"));
                System.out.println(f1id + " : " + f2id);
            }
        }

        /**
         * 测试QualifierFilter(列过滤器)
         */
        @Test
        public void testColFilter() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();
            QualifierFilter colfilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("id")));
            scan.setFilter(colfilter);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                byte[] f1id = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
                byte[] f2id = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("id"));
                byte[] f2name = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("name"));
                System.out.println(f1id + " : " + f2id + " : " + f2name);
            }
        }


        /**
         * 测试ValueFilter(值过滤器)
         * 过滤value的值,含有指定的字符子串
         */
        @Test
        public void testValueFilter() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();
            ValueFilter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("to"));
            scan.setFilter(filter);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                byte[] f1id = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
                byte[] f2id = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("id"));
                byte[] f1name = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("name"));
                byte[] f2name = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("name"));
                System.out.println(f1id + " : " + f2id + " : " + Bytes.toString(f1name) + " : " + Bytes.toString(f2name));
            }
        }

        /**
         * DependentColumnFilter 依赖列过滤器     自定义一种过滤基数
         */
        @Test
        public void testDepFilter() throws IOException {
            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();
            DependentColumnFilter filter = new DependentColumnFilter(Bytes.toBytes("f2"),
                    Bytes.toBytes("addr"),
                    true,
                    CompareFilter.CompareOp.NOT_EQUAL,
                    new BinaryComparator(Bytes.toBytes("beijing"))
                    );
            scan.setFilter(filter);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                byte[] f1id = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
                byte[] f2id = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("id"));
                byte[] f1name = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("name"));
                byte[] f2name = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("name"));
                System.out.println(f1id + " : " + f2id + " : " + Bytes.toString(f1name) + " : " + Bytes.toString(f2name));
            }
        }

        /**
         * 单列值value过滤,  和值过滤器对比看
         * 如果value不满足,整行滤掉
         */
        @Test
        public void testSingleColumValueFilter() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();
            SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("f2",
                    Bytes.toBytes("name"),
                    CompareFilter.CompareOp.NOT_EQUAL),
                    new BinaryComparator(Bytes.toBytes("tom2.1")));

            //ValueFilter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("to"));
            scan.setFilter(filter);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                byte[] f1id = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
                byte[] f2id = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("id"));
                byte[] f1name = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("name"));
                byte[] f2name = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("name"));
                System.out.println(f1id + " : " + f2id + " : " + Bytes.toString(f1name) + " : " + Bytes.toString(f2name));
            }
        }
    复杂查询  like
    -----------------
        如 sql:  select * from t7 where ((age <= 13) and (name like '%t')  or  (age > 13) and (name like 't%'))
    FilterList
    ----------------
        @Test
        public void testComboFilter() throws IOException {

            Configuration conf = HBaseConfiguration.create();
            Connection conn = ConnectionFactory.createConnection(conf);
            TableName tname = TableName.valueOf("ns1:t7");
            Scan scan = new Scan();

            //where ... f2:age <= 13
            SingleColumnValueFilter ftl = new SingleColumnValueFilter(
                    Bytes.toBytes("f2"),
                    Bytes.toBytes("age"),
                    CompareFilter.CompareOp.LESS_OR_EQUAL,
                    new BinaryComparator(Bytes.toBytes("13"))
            );

            //where ... f2:name like %t
            SingleColumnValueFilter ftr = new SingleColumnValueFilter(
                    Bytes.toBytes("f2"),
                    Bytes.toBytes("name"),
                    CompareFilter.CompareOp.EQUAL,
                    new RegexStringComparator("^t")
            );
            //ft
            FilterList ft = new FilterList(FilterList.Operator.MUST_PASS_ALL);
            ft.addFilter(ftl);
            ft.addFilter(ftr);

            //where ... f2:age > 13
            SingleColumnValueFilter fbl = new SingleColumnValueFilter(
                    Bytes.toBytes("f2"),
                    Bytes.toBytes("age"),
                    CompareFilter.CompareOp.GREATER,
                    new BinaryComparator(Bytes.toBytes("13"))
            );

            //where ... f2:name like %t
            SingleColumnValueFilter fbr = new SingleColumnValueFilter(
                    Bytes.toBytes("f2"),
                    Bytes.toBytes("name"),
                    CompareFilter.CompareOp.EQUAL,
                    new RegexStringComparator("t$")
            );
            //ft
            FilterList fb = new FilterList(FilterList.Operator.MUST_PASS_ALL);
            fb.addFilter(fbl);
            fb.addFilter(fbr);


            FilterList fall = new FilterList(FilterList.Operator.MUST_PASS_ONE);
            fall.addFilter(ft);
            fall.addFilter(fb);

            scan.setFilter(fall);
            Table t = conn.getTable(tname);
            ResultScanner rs = t.getScanner(scan);
            Iterator<Result> it = rs.iterator();
            while (it.hasNext()) {
                Result r = it.next();
                byte[] f1id = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
                byte[] f2id = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("id"));
                byte[] f1name = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("name"));
                byte[] f2name = r.getValue(Bytes.toBytes("f2"), Bytes.toBytes("name"));
                System.out.println(f1id + " : " + f2id + " : " + Bytes.toString(f1name) + " : " + Bytes.toString(f2name));
            }
        }

    分页过滤器:

    列分页过滤:
     select "fl:name"
    keyOnly过滤器 ,只提取key 。丢弃value;


  • 相关阅读:
    super与this的比较
    队列学习小结
    最左原则
    show processlist
    循环
    打印偶数
    发布模块
    eval函数
    文件
    模块
  • 原文地址:https://www.cnblogs.com/zyanrong/p/10753819.html
Copyright © 2020-2023  润新知