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();
        }        
    }

 

 

posted @ 2014-05-26 19:43  wishyouhappy  阅读(3838)  评论(0编辑  收藏  举报