zoukankan      html  css  js  c++  java
  • HBase Client API使用(二)---查询及过滤器

    相关知识


    创建表插入数据删除等见:http://www.cnblogs.com/wishyouhappy/p/3735077.html

    HBase API简介见:http://www.cnblogs.com/wishyouhappy/p/3753347.html

    按行、列簇等查询


    package wish.hbase;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.KeyValue;
    import org.apache.hadoop.hbase.client.Get;
    import org.apache.hadoop.hbase.client.HTable;
    import org.apache.hadoop.hbase.client.HTablePool;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.client.ResultScanner;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
    import org.apache.hadoop.hbase.filter.FilterList;
    import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
    import org.apache.hadoop.hbase.util.Bytes;
    
    public class HBaseQuerydata
    {
        static Configuration cfg = HBaseConfiguration.create();
        static {
            
            cfg.set("hbase.zookeeper.quorum", "192.168.1.95");
            cfg.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static void queryByRowKey(String tablename, String rowKey) throws IOException
        {
            HTable table = new HTable(cfg, tablename);
            Get g = new Get(rowKey.getBytes());
            Result rs = table.get(g);
    
            for (KeyValue kv : rs.raw())
            {
                System.out.println("rowkey:        " + new String(kv.getRow()));
                System.out.println("Column Family: " + new String(kv.getFamily()));
                System.out.println("Column       : " + new String(kv.getQualifier()));
                System.out.println("value        : " + new String(kv.getValue()));
            }
        }
    
        public static void queryByRowKeyFamily(String tablename, String rowKey, String family) throws IOException
        {
            HTable table = new HTable(cfg, tablename);
            Get g = new Get(rowKey.getBytes());
            g.addFamily(Bytes.toBytes(family));
            Result rs = table.get(g);
            for (KeyValue kv : rs.raw())
            {
                System.out.println("rowkey:        " + new String(kv.getRow()));
                System.out.println("Column Family: " + new String(kv.getFamily()));
                System.out.println("Column       : " + new String(kv.getQualifier()));
                System.out.println("value        : " + new String(kv.getValue()));
            }
        }
    
        public static void queryByRowKeyFamilyColumn(String tablename, String rowKey, String family, String column)
                throws IOException
        {
            HTable table = new HTable(cfg, tablename);
            Get g = new Get(rowKey.getBytes());
            g.addColumn(family.getBytes(), column.getBytes());
    
            Result rs = table.get(g);
    
            for (KeyValue kv : rs.raw())
            {
                System.out.println("rowkey:        " + new String(kv.getRow()));
                System.out.println("Column Family: " + new String(kv.getFamily()));
                System.out.println("Column       : " + new String(kv.getQualifier()));
                System.out.println("value        : " + new String(kv.getValue()));
            }
        }
    
        
    
        /*
         * 查询所有
         */
        public static void queryAll(String tableName) { 
            HTablePool pool = new HTablePool(cfg, 1000); 
            try { 
                ResultScanner rs = pool.getTable(tableName).getScanner(new Scan()); 
                for (Result r : rs) { 
                    System.out.println("rowkey:" + new String(r.getRow())); 
                    for (KeyValue keyValue : r.raw()) { 
                        System.out.println("列:" + new String(keyValue.getFamily()) 
                                + "     值:" + new String(keyValue.getValue())); 
                    } 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    
        public static void main(String[] args) throws Exception
        {
          System.out.println("******************************queryall******************************");
            queryAll("wishtest1");System.out.println("******************************query by rowkey******************************");
            queryByRowKey("wishTest1", "2");
            System.out.println("******************************query by rowkey family******************************");
            queryByRowKeyFamily("wishTest1", "2","name");
            System.out.println("******************************query by rowkey family column******************************");
            queryByRowKeyFamilyColumn("wishTest1", "6","score","Chinese");
        }
    }

    输出如下:

    ******************************queryall******************************
    rowkey:****1121
    列:age     值:20
    列:gender     值:male
    列:name     值:Chander
    列:score     值:120
    列:score     值:100
    列:score     值:99
    rowkey:*1111
    列:age     值:20
    列:gender     值:male
    列:name     值:Chander
    列:score     值:120
    列:score     值:100
    列:score     值:99
    rowkey:1
    列:age     值:20
    列:gender     值:male
    列:name     值:rain
    rowkey:2
    列:age     值:20
    列:gender     值:female
    列:name     值:wish
    rowkey:3
    列:age     值:20
    列:gender     值:male
    列:name     值:Joey
    rowkey:4
    列:age     值:20
    列:gender     值:male
    列:name     值:Jenny
    列:score     值:90
    列:score     值:100
    列:score     值:100
    列:score     值:90
    rowkey:5
    列:age     值:20
    列:gender     值:male
    列:name     值:Chander
    列:score     值:120
    列:score     值:100
    列:score     值:99
    rowkey:6
    列:age     值:20
    列:gender     值:male
    列:name     值:Joey
    列:score     值:100
    列:score     值:100
    列:score     值:90
    ******************************query by rowkey******************************
    rowkey:        2
    Column Family: age
    Column       : 
    value        : 20
    rowkey:        2
    Column Family: gender
    Column       : 
    value        : female
    rowkey:        2
    Column Family: name
    Column       : 
    value        : wish
    ******************************query by rowkey family******************************
    rowkey:        2
    Column Family: name
    Column       : 
    value        : wish
    ******************************query by rowkey family column******************************
    rowkey:        6
    Column Family: score
    Column       : Chinese
    value        : 100

    行过滤器


    使用过滤器可以提高操作表的效率,HBase中两种数据读取函数get()和scan()都支持过滤器

    可以使用预定义好的过滤器或者是实现自定义过滤器

    过滤器在客户端创建,通过RPC传送到服务器端,在服务器端执行过滤操作

    行过滤器简单例子如下:

    测试table中所有数据如下:

    rowkey:****1121
    列:age     值:20
    列:gender     值:male
    列:name     值:Chander
    列:score     值:120
    列:score     值:100
    列:score     值:99
    rowkey:*1111
    列:age     值:20
    列:gender     值:male
    列:name     值:Chander
    列:score     值:120
    列:score     值:100
    列:score     值:99
    rowkey:1
    列:age     值:20
    列:gender     值:male
    列:name     值:rain
    rowkey:2
    列:age     值:20
    列:gender     值:female
    列:name     值:wish
    rowkey:3
    列:age     值:20
    列:gender     值:male
    列:name     值:Joey
    rowkey:4
    列:age     值:20
    列:gender     值:male
    列:name     值:Jenny
    列:score     值:90
    列:score     值:100
    列:score     值:100
    列:score     值:90
    rowkey:5
    列:age     值:20
    列:gender     值:male
    列:name     值:Chander
    列:score     值:120
    列:score     值:100
    列:score     值:99
    rowkey:6
    列:age     值:20
    列:gender     值:male
    列:name     值:Joey
    列:score     值:100
    列:score     值:100
    列:score     值:90

    eg1:

    public static void rowFilterLESS_OR_EQUAL(String tableName, String columnFamily, String column, String condition){
            System.out.println("***********************start rowFilterLESS_OR_EQUAL***************************");
            Scan scan = new Scan();
            scan.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
            
            Filter f = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(condition)));
            scan.setFilter(f);
            HTablePool pool = new HTablePool(cfg, 1000); 
            try {
                ResultScanner resultScanner = pool.getTable(tableName).getScanner(scan);
                Result rs = resultScanner.next();
                    for (; rs != null; rs = resultScanner.next())
                    {
                        for (KeyValue kv : rs.list())
                        {
                            System.out.println("-------------------------------");
                            System.out.println("rowkey:        " + new String(kv.getRow()));
                            System.out.println("Column Family: " + new String(kv.getFamily()));
                            System.out.println("Column       :" + new String(kv.getQualifier()));
                            System.out.println("value        : " + new String(kv.getValue()));
                        }
                    }
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("***********************end rowFilterLESS_OR_EQUAL***************************");
    
        }
    public static void main(String[] args) {
            String tableName = "wishTest1";
            HBaseFilter.rowFilterLESS_OR_EQUAL(tableName, "score", "Math", "4");
        }

    输出:

    ***********************start rowFilterLESS_OR_EQUAL***************************
    
    -------------------------------
    rowkey:        ****1121
    Column Family: score
    Column       :Math
    value        : 99
    -------------------------------
    rowkey:        *1111
    Column Family: score
    Column       :Math
    value        : 99
    -------------------------------
    rowkey:        4
    Column Family: score
    Column       :Math
    value        : 90
    -------------------------------
    rowkey:        5
    Column Family: score
    Column       :Math
    value        : 99
    ***********************end rowFilterLESS_OR_EQUAL***************************

    eg2:

        /*
         * rowFilterRegex
         */
        public static void rowFilterRegex(String tableName, String columnFamily, String column, String condition){
            System.out.println("***********************start rowFilterRegex***************************");
            Scan scan = new Scan();
            scan.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
            
            Filter f = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("\*."));
            scan.setFilter(f);
            HTablePool pool = new HTablePool(cfg, 1000); 
            try {
                ResultScanner resultScanner = pool.getTable(tableName).getScanner(scan);
                Result rs = resultScanner.next();
                    for (; rs != null; rs = resultScanner.next())
                    {
                        for (KeyValue kv : rs.list())
                        {
                            System.out.println("-------------------------------");
                            System.out.println("rowkey:        " + new String(kv.getRow()));
                            System.out.println("Column Family: " + new String(kv.getFamily()));
                            System.out.println("Column       :" + new String(kv.getQualifier()));
                            System.out.println("value        : " + new String(kv.getValue()));
                        }
                    }
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("***********************end rowFilterRegex***************************");
    
        }
    public static void main(String[] args) {
            String tableName = "wishTest1";
            HBaseFilter.rowFilterRegex(tableName, "score", "Math", "\*");
        }

    输出:

    ***********************start rowFilterRegex***************************
    -------------------------------
    rowkey:        ****1121
    Column Family: score
    Column       :Math
    value        : 99
    -------------------------------
    rowkey:        *1111
    Column Family: score
    Column       :Math
    value        : 99
    ***********************end rowFilterRegex***************************

    eg3:

    /*
         * rowFilterSubstring
         */
        public static void rowFilterSubstring(String tableName, String columnFamily, String column, String condition){
            System.out.println("***********************start rowFilterSubstring***************************");
            Scan scan = new Scan();
            scan.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));
            
            Filter f = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("\*"));
            scan.setFilter(f);
            HTablePool pool = new HTablePool(cfg, 1000); 
            try {
                ResultScanner resultScanner = pool.getTable(tableName).getScanner(scan);
                Result rs = resultScanner.next();
                for (; rs != null; rs = resultScanner.next())
                {
                    for (KeyValue kv : rs.list())
                    {
                        System.out.println("-------------------------------");
                        System.out.println("rowkey:        " + new String(kv.getRow()));
                        System.out.println("Column Family: " + new String(kv.getFamily()));
                        System.out.println("Column       :" + new String(kv.getQualifier()));
                        System.out.println("value        : " + new String(kv.getValue()));
                    }
                }
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("***********************end rowFilterSubstring***************************");
            
        }
        public static void main(String[] args) {
            String tableName = "wishTest1";
            HBaseFilter.rowFilterSubstring(tableName, "score", "Math", "\*");
        }

    输出同上

     列簇过滤器


    public static void familyFilterLess(String tableName, String condition){
            Filter filter = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes(condition)));
            Scan scan = new Scan();
            scan.setFilter(filter);
            HTablePool pool = new HTablePool(cfg,100);
            try {
                ResultScanner resultScanner = pool.getTable(tableName).getScanner(scan);
                Result rs = resultScanner.next();
                for (; rs != null; rs = resultScanner.next())
                {
                    for (KeyValue kv : rs.list())
                    {
                        System.out.println("-------------------------------");
                        System.out.println("rowkey:        " + new String(kv.getRow()));
                        System.out.println("Column Family: " + new String(kv.getFamily()));
                        System.out.println("Column       :" + new String(kv.getQualifier()));
                        System.out.println("value        : " + new String(kv.getValue()));
                    }
                }
                
                resultScanner.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
        }
        
        
        public static void main(String[] args) {
            String tableName = "wishTest1";
            HBaseFilter.familyFilterLess(tableName, "gender");
            //HBaseFilter.rowFilterSubstring(tableName, "score", "Math", "\*");
        }

    输出:

    -------------------------------
    rowkey:        ****1121
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        *1111
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        1
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        2
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        3
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        4
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        5
    Column Family: age
    Column       :
    value        : 20
    -------------------------------
    rowkey:        6
    Column Family: age
    Column       :
    value        : 20

    列名过滤器


        /*
         * 列名过滤器
         */
        
        public static void qualifierFilterLess(String tableName, String condition){
            Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes(condition)));
            Scan scan = new Scan();
            scan.setFilter(filter);
            HTablePool pool = new HTablePool(cfg,100);
            try {
                ResultScanner resultScanner = pool.getTable(tableName).getScanner(scan);
                Result rs = resultScanner.next();
                for (; rs != null; rs = resultScanner.next())
                {
                    for (KeyValue kv : rs.list())
                    {
                        System.out.println("-------------------------------");
                        System.out.println("rowkey:        " + new String(kv.getRow()));
                        System.out.println("Column Family: " + new String(kv.getFamily()));
                        System.out.println("Column       :" + new String(kv.getQualifier()));
                        System.out.println("value        : " + new String(kv.getValue()));
                    }
                }
                
                resultScanner.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
        }
        

     值过滤器


        /*
         * 值过滤器
         */
        
        public static void valueFilterLess(String tableName, String condition){
            Filter filter = new ValueFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes(condition)));
            Scan scan = new Scan();
            scan.setFilter(filter);
            HTablePool pool = new HTablePool(cfg,100);
            try {
                ResultScanner resultScanner = pool.getTable(tableName).getScanner(scan);
                Result rs = resultScanner.next();
                for (; rs != null; rs = resultScanner.next())
                {
                    for (KeyValue kv : rs.list())
                    {
                        System.out.println("-------------------------------");
                        System.out.println("rowkey:        " + new String(kv.getRow()));
                        System.out.println("Column Family: " + new String(kv.getFamily()));
                        System.out.println("Column       :" + new String(kv.getQualifier()));
                        System.out.println("value        : " + new String(kv.getValue()));
                    }
                }
                
                resultScanner.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
        }
  • 相关阅读:
    如何在C++中获得完整的类型名称(RTTI的typeid在不同平台下有不同的输出值表达,自建类改进了RTTI丢失的信息)
    对Msn协议的一点点研究
    UTF-8、UTF-16、UTF-32编码的相互转换
    支持引用计数的智能指针类模板
    一个简单的RTTI实现
    js 调用父窗口的方法
    关于内存对齐的那些事
    Delphi 函数指针(三大好处:灵活,委托的本质,回调机制),还可把函数指针当参数传入
    自写的LastPos,寻找字符串里的最后一个字符,RTL里没有提供这个函数——Delphi的String下标是从1开始的
    墨菲定律——别试图教猫唱歌,这样不但不会有结果,还会惹猫不高兴(就是不要把自己的意志强加于别人,无论是好心还是坏心)
  • 原文地址:https://www.cnblogs.com/wishyouhappy/p/3753760.html
Copyright © 2011-2022 走看看