zoukankan      html  css  js  c++  java
  • 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;


  • 相关阅读:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    php使用 _before_index() 来实现访问页面前,判断登录
    php使用 _before_index() 来实现访问页面前,判断登录
    查询方式实例演示
    查询方式实例演示
    haproxy timeout server 46000 后台超时时间
    haproxy timeout server 46000 后台超时时间
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
  • 原文地址:https://www.cnblogs.com/zyanrong/p/10753819.html
Copyright © 2011-2022 走看看