HBase的基本API,包括增删改查等,增和删是相对简单的操作,与传统的RDBMS相比较,这里的查询操作略显苍白,只能根据特性的行键进行查询(get) 或者根据行键的范围来查询(Scan).
HBase不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询.
通过这些过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选数据能够细化到具体的存储单元格上(由行键,列簇,时间戳定位).
HBase过滤器的类型很多,但是可以分为两大类:比较过滤器,专用过滤器.
比较过滤器 通用比较器1
比较器作为过滤气的核心组成之一,用于处理具体的比较逻辑,列入字节级的比较,字符串的比较等.
BinaryComparator
二级制比较器,用于按字典顺序比较Byte数据值
BinaryPrefixComparator
前缀二进制比较器 按前缀比较
NullComparator
判断给定的是否为空
BitComparator
按位比较
RegexStringComparator
支持正则表达式的值比较,仅支持EQUAL和非EQUAL
SubStringComparator
判断提供的子串是否出现在value中 不区分大小写
比较过滤器,通用操作符
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL<>
GREATER_OR_EQUAL>=
GREATER >
NO_OP 排除所有
比较过滤器 行键过滤器
RowFilter
删除行键匹配的所有的行
语法
RowFilter(操作符,比较器)
性能
一般来讲,执行Scan使用startRow/stopRow方式比较好
FamilyFilter
筛选出列簇匹配的数据
返回数据的单位是Cell 而不是整行数据
语法
familyFilter(操作符,比较)
性能
通常在Scan过程中通过设定某列列簇来实现该功能而不是直接使用该过滤器
QualifierFilter
筛选子列匹配的数据
返回数据的单位是Cell而不是整形数据
语法
QualifierFilter(操作符,比较器)
public class HbaseScanTest {
//创建配置链接
private Configuration configuration = HBaseConfiguration.create();
private Connection connection;
//声明表
private Table bd17Test;
//在方法的构造体中 初始化数据 链接hbase和链接到table的表上
public HbaseScanTest() throws IOException {
connection = ConnectionFactory.createConnection(configuration);
bd17Test = connection.getTable(TableName.valueOf("bd17:fromjava"));
}
// scan test 这个方法用于测试scan 和过滤的
public void scanData() throws IOException {
Scan scan = new Scan();
//resultScanner 的next方法返回查询结果集中的下一条数据 ,如果没有下一条数据
//则next返回结果是null
//输出条件从 row的rowKey_2开始到row为rowKey_5结束不包含rowKey_5
scan.setStartRow(Bytes.toBytes("rowKey_2"));
scan.setStopRow(Bytes.toBytes("rowKey_5"));
ResultScanner rs = bd17Test.getScanner(scan);
Result result = rs.next();
while (result != null) {
CellScanner cs =result.cellScanner();
System.out.println("rowKey:"+Bytes.toString(result.getRow()));
while(cs.advance()){
Cell cell =cs.current();
String family =Bytes.toString(CellUtil.cloneFamily(cell));
String qualify =Bytes.toString(CellUtil.cloneQualifier(cell));
String value =Bytes.toString(CellUtil.cloneValue(cell));
System.out.println("family"+family+"qualify"+qualify+"value"+value);
}
result = rs.next();
}
}
public static void main(String[] args) throws IOException {
HbaseScanTest hbaseScanTest =new HbaseScanTest();
hbaseScanTest.scanData();
}
}
public class HbaseScanTest {
private Configuration configuration = HBaseConfiguration.create();
private Connection connection;
private Table bd17Test;
public HbaseScanTest() throws IOException {
connection = ConnectionFactory.createConnection(configuration);
bd17Test = connection.getTable(TableName.valueOf("bd17:fromjava"));
}
//rowfilter
//获取rowkey中包含row的数据(这个方法被注释了)
public void getByRowFilter() throws IOException{
//首先构建sanner
Scan scan =new Scan();
// RowFilter rowFilter =new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("row"));
//把过滤器加入到scan中
// scan.setFilter(rowFilter);
//把san加入到table上进行扫描获取resultscanner结果
// ResultScanner rScanner =bd17Test.getScanner(scan);
// ShowResult(rScanner);
//获取rowkey<rowKey_5并且包含rowKey_5>
RowFilter ltRowFilter =new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("rowKey_5")));
scan.setFilter(ltRowFilter);
ResultScanner rScanner =bd17Test.getScanner(scan);
ShowResult(rScanner);
}
//输出的整个太过麻烦将其封装成方法而已
public void ShowResult(ResultScanner rs) throws IOException{
Result result = rs.next();
while (result != null) {
CellScanner cs =result.cellScanner();
System.out.println("rowKey:"+Bytes.toString(result.getRow()));
while(cs.advance()){
Cell cell =cs.current();
String family =Bytes.toString(CellUtil.cloneFamily(cell));
String qualify =Bytes.toString(CellUtil.cloneQualifier(cell));
String value =Bytes.toString(CellUtil.cloneValue(cell));
System.out.println("family:"+family+" qualify:"+qualify+" value:"+value);
}
result = rs.next();
}
}
//familyfilter返回的是设置是列簇的数据
public void getFamilyFilter() throws IOException{
Filter famliyFilter = new FamilyFilter(CompareOp.EQUAL.LESS, new BinaryComparator(Bytes.toBytes("j")));
Scan scan =new Scan();
scan.setFilter(famliyFilter);
ResultScanner rs= bd17Test.getScanner(scan);
ShowResult(rs);
}
//getByQualifyFilter l列名称过滤器 只返回能批匹配的列名称的单元格数据
public void getByQualifyFilter() throws IOException{
org.apache.hadoop.hbase.filter.Filter qualifyFilter =new QualifierFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("tele")));
Scan scan =new Scan();
scan.setFilter(qualifyFilter);
ResultScanner rs =bd17Test.getScanner(scan);
ShowResult(rs);
}
public static void main(String[] args) throws IOException {
HbaseScanTest hbaseScanTest =new HbaseScanTest();
// hbaseScanTest.scanData();
hbaseScanTest.getByRowFilter();
hbaseScanTest.getFamilyFilter();
hbaseScanTest.getByQualifyFilter();
}
比较过滤器 子列范围过滤器
CloumnRangeFilter
--该过滤器用获取一个指定子列范围内的所有Cell
语法
--columnRangeFilter(子列起始值,是否包含起始值,子列结束值,是否包含结束值)
性能
--该过滤器可以进行高效的子列内部扫描(因为子列是已经按字典排序好的)
public void getByClumnRangeFilter() throws IOException{
Filter cRangeFilter =new ColumnRangeFilter(Bytes.toBytes("o_name1"), true, Bytes.toBytes("o_name2"),true);
Scan scan =new Scan();
scan.setFilter(cRangeFilter);
ResultScanner rs =bd17Test.getScanner(scan);
ShowResult(rs);
}
比较过滤器 列值过滤器
ValueFilter
--筛选出劣质匹配的数据
--返回数据的单位是Cell,而不是整行数据
语法
--ValueFilter(操作符,比较器)
//按照姓名查找用户信息 只返回能匹配上的列值单元格的数据
public void GetBySearchValue() throws IOException{
Filter getBySearchValue =new ValueFilter(CompareOp.EQUAL, new RegexStringComparator("n_6"));
Scan scan =new Scan();
scan.setFilter(getBySearchValue);
ResultScanner rs =bd17Test.getScanner(scan);
ShowResult(rs);
}
行健前缀过滤器
PreFixFilter
---筛选出行健前缀匹配的所有的行
语法
---PrefixFilter(行健前缀)
public void getPrefilter() throws IOException{
Filter cPreFilter =new PrefixFilter(Bytes.toBytes("xisi"));
Scan scan =new Scan();
scan.setFilter(cPreFilter);
ResultScanner rs =bd17Test.getScanner(scan);
ShowResult(rs);
}
专用过滤器 子列前缀过滤器
ColumnPrefixFilter
筛选出包含前缀的所有子列
返回数据的单位是Cell 而不是整行数据一般来讲
语法
ColumnPrefixFilter(前缀)
new ColumnPrefixFilter(Bytes.toBytes("cloumn"))
筛选所有以column开头子列cell
专用过滤器 多子列前缀过滤器器
MultpleColumnPrefixFilter
MultipleColumnPrefixFilter 与 ColumnPrefixFilter 的行为类似,但可以指定多个子列前缀
语法
MultipleColumnPrefixFilter(前缀byte二维数组)
byte[][] prefixes = new byte[][]{Bytes.toBytes("column 1"), Bytes.toBytes("column2")}
new MultipleColumnPrefixFilter (prefixes)
筛选出所有以column1和column2开头子列的cell
专用过滤器 列综合过滤器
DependentColumnFilter
该过滤器尝试找到该列簇、子列所在的Cell。
语法
DependentColumnFilter(列簇、子列)
示例代码
new DependentColumnFilter(
Bytes.toBytes("family1"), Bytes.toBytes("column1"))
筛选出所有列簇family1、子列column1的所有Cell
FilterList
该过滤器代表一个过滤器链 ,它可以包含一组即将应用于目标数据集的过滤器,过滤器间具有“与”和“或”关系。
语法
FilterList(列关系、过滤器集合)
FilterList.Operator.MUST_PASS_ ALL 关系与
FilterList.Operator.MUST_PASS_ ONE 关系或
通过Hbase的过滤器,我们可以在HBase中的数据多个维度(行,列,数据版本)上进行对数据的筛选操作。
Hbase大致上可以分为比较过滤器和专用过滤器。
比较过滤器有行健过滤器、列簇过滤器、子列过滤器、子列范围过滤器、列值过滤器。
专用过滤器有行健前缀过滤器、子列前缀过滤器、多子列前缀过滤器、列综合过滤器、结构过滤器。
除了这些常用过滤器外,Hbase还提供其它一些过滤器,比如分页过滤等,可以在实际使用到的时候灵活选用。