H-JavaAPI之过滤器

过滤器流程

1、构造Table对象

Table table = connection.getTable(TableName.valueOf(NSName + ":" + tableName));

2、构造Scan对象

Scan scan = new Scan();

3、构造比较器对象

比较器类型较多,在下面讲解

4、构造过滤器对象

过滤器对象类型较多,在下面讲解

根据自己的需求使用相应的过滤器

5、将比较器对象绑定到过滤器对象

举例说明:

new SingleColumnValueFilter("person".getBytes(),"age".getBytes(),CompareOperator.EQUAL,new SubstringComparator(colName));

6、将过滤器对象绑定到Scan对象

scan.setFilter(filter);

7、将Scan绑定到Table对象

ResultScanner rs = table.getScanner(scan);

8、读取Table中的信息

ResultScanner rs = table.getScanner(scan);
for (Result r : rs){
    if(r!=null){
                for(Cell cell : r.listCells()){
                    System.out.print("行鍵:"+new String(CellUtil.cloneRow(cell))+"\t");
                    System.out.print("列族:"+new String(CellUtil.cloneFamily(cell))+"\t");
                    System.out.print("列:"+new String(CellUtil.cloneQualifier(cell))+"\t");
                    System.out.print("值:"+new String(CellUtil.cloneValue(cell))+"\t");
                    System.out.println("時間戳:"+cell.getTimestamp());
                }
            }
}

比较器类型

RegexStringComparator

正则比较器

//匹配名字为uname或age(支持正则表达式)
new RegexStringComparator("uname|age");

BinaryComparator

名称比较器

//匹配目标的名字
new BinaryComparator("age");

BinaryPrefixComparator

名称开头比较器

//匹配开头为a的字符串
new BinaryComparator("a");

SubstringComparator

名称包含比较器

//匹配名字中含有相应字符串的字符
new SubstringComparator("am");

NullComparator

空比较器

行过滤器

/**
     * 制造一个行过滤器
     * @return
     */
    public static RowFilter makeRowFilter(String rowKey){
        RowFilter rowFilter =  new RowFilter(CompareOperator.GREATER_OR_EQUAL, new BinaryPrefixComparator(rowKey.getBytes()));
        return rowFilter;
    }

列族过滤器

 /**
     * 制造一个列族过滤器
     * @return
     */
    public static FamilyFilter makeCFFilter(String cfName){
        return  new FamilyFilter(CompareOperator.EQUAL,new BinaryComparator(cfName.getBytes()));
//        return  new FamilyFilter(CompareOperator.EQUAL,new BinaryPrefixComparator("p".getBytes()));
    }

列过滤器

 /**
     * 制造一个列过滤器
     * @return
     */
    public static QualifierFilter makeQualifierFilter(String colName){
//        return  new QualifierFilter(CompareOperator.EQUAL,new RegexStringComparator("uname|age"));
//        return  new QualifierFilter(CompareOperator.EQUAL,new SubstringComparator("r"));
//        return  new QualifierFilter(CompareOperator.EQUAL,new BinaryComparator("uname".getBytes()));
        return  new QualifierFilter(CompareOperator.EQUAL,new BinaryPrefixComparator(colName.getBytes()));
    }

单个值过滤器

/**
     * 制造一个单列值比较器
     * @return
     */
    public static SingleColumnValueFilter makeSingleColumnValueFilter(String colName){
        return new SingleColumnValueFilter("person".getBytes(),"age".getBytes(),CompareOperator.EQUAL,new SubstringComparator(colName));
//        return new SingleColumnValueFilter("person".getBytes(),"age".getBytes(),CompareOperator.GREATER,"30".getBytes());
    }

FirstKeyOnlyFilter

/**
     * 制造一个FirstKeyOnlyFilter 其返回值:每一行的第一个列族的第一个列的名字和值
     * @return
     */
    public static FirstKeyOnlyFilter makeFirstKeyOnlyFilter(){
        return new FirstKeyOnlyFilter();
    }

总流程

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.filter.RowFilter;

import java.io.IOException;

public class HBaseScanner {
    public static void main(String[] args) throws IOException {
        Connection connection = HBaseUnit.getHBaseConnection();



        connection.close();
    }

    /**
     * 制造一个行过滤器
     * @return
     */
    public static RowFilter makeRowFilter(String rowKey){
        RowFilter rowFilter =  new RowFilter(CompareOperator.GREATER_OR_EQUAL, new BinaryPrefixComparator(rowKey.getBytes()));
        return rowFilter;
    }

    /**
     * 制造一个列族过滤器
     * @return
     */
    public static FamilyFilter makeCFFilter(String cfName){
        return  new FamilyFilter(CompareOperator.EQUAL,new BinaryComparator(cfName.getBytes()));
//        return  new FamilyFilter(CompareOperator.EQUAL,new BinaryPrefixComparator("p".getBytes()));
    }

    /**
     * 制造一个列过滤器
     * @return
     */
    public static QualifierFilter makeQualifierFilter(String colName){
//        return  new QualifierFilter(CompareOperator.EQUAL,new RegexStringComparator("uname|age"));
//        return  new QualifierFilter(CompareOperator.EQUAL,new SubstringComparator("r"));
//        return  new QualifierFilter(CompareOperator.EQUAL,new BinaryComparator("uname".getBytes()));
        return  new QualifierFilter(CompareOperator.EQUAL,new BinaryPrefixComparator(colName.getBytes()));
    }

    /**
     * 制造一个单列值比较器
     * @return
     */
    public static SingleColumnValueFilter makeSingleColumnValueFilter(String colName){
        return new SingleColumnValueFilter("person".getBytes(),"age".getBytes(),CompareOperator.EQUAL,new SubstringComparator(colName));
//        return new SingleColumnValueFilter("person".getBytes(),"age".getBytes(),CompareOperator.GREATER,"30".getBytes());
    }

    /**
     * 制造一个FirstKeyOnlyFilter 其返回值:每一行的第一个列族的第一个列的名字和值
     * @return
     */
    public static FirstKeyOnlyFilter makeFirstKeyOnlyFilter(){
        return new FirstKeyOnlyFilter();
    }

    public static FilterList makeFileterList(){
        //多个过滤器之间连接的方式
        //and FilterList.Operator.MUST_PASS_ALL
        //or FilterList.Operator.MUST_PASS_ONE
        FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        fl.addFilter(makeSingleColumnValueFilter("8"));//查询年龄中包含8的雇员的所有信息
        fl.addFilter(makeQualifierFilter("uname"));//限定只查询名字
        return fl;
    }

    /**
     * 构造扫描器,将扫描器传入到表查询中
     * @param connection 连接对象
     * @param NSName 命名空间名称
     * @param tableName 表名
     * @param filter 过滤器对象
     * @throws Exception
     */
    public static  void filterData(Connection connection , String NSName , String tableName , Filter filter) throws Exception {
        Table table = connection.getTable(TableName.valueOf(NSName + ":" + tableName));
        Scan scan = new Scan();
        scan.setFilter(filter);
//        table.getScanner(scan);
        ResultScanner rs = table.getScanner(scan);
        for (Result r : rs){
            showResult(r);
        }
    }
    /**
     * 获取全部行的数据
     * @param oneRowResult 表名
     * @throws Exception
     */
    public static void showResult(Result oneRowResult) throws Exception{
        if(oneRowResult!=null){
            for(Cell cell : oneRowResult.listCells()){
                System.out.print("行鍵:"+new String(CellUtil.cloneRow(cell))+"\t");
                System.out.print("列族:"+new String(CellUtil.cloneFamily(cell))+"\t");
                System.out.print("列:"+new String(CellUtil.cloneQualifier(cell))+"\t");
                System.out.print("值:"+new String(CellUtil.cloneValue(cell))+"\t");
                System.out.println("時間戳:"+cell.getTimestamp());
            }
        }
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43637653/article/details/83855783