H-JavaAPI之过滤器
程序员文章站
2022-04-03 08:53:52
...
文章目录
过滤器流程
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());
}
}
}
}
上一篇: SpringBoot 全局异常捕获不到Filter中的异常
下一篇: shiro过滤器