过滤器:值过滤、单值过滤器、过滤器链、行过滤器、列过滤器等。
比较器:二进制、字符串前缀比较、正则比较器等
能不用过滤器尽量不用过滤器,因为性能肯定没有直接使用get快。
LESS,
LESS_OR_EQUAL,
EQUAL,
NOT_EQUAL,
GREATER_OR_EQUAL,
GREATER,
NO_OP
代码实现
import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* FilterList过滤器链:可以存放多个过滤器一起对数据过滤
*
* 需求:
* 1、查询年龄为80,且name为ls开头
* where age=80 and name like "ls%" or
*
* 2、查询年龄为80,或name为ls8开头
* where age>80 or name like "ls8%"
*/
public class Demo07_FilterList {
public static void main(String[] args) throws IOException {
//获取table对象
Table tb = HbaseUtil.getTable("tb");
//获取FilterList
/*
MUST_PASS_ALL : and
MUST_PASS_ONE : or
*/
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
//构造单值过滤器
/*
LESS : <
LESS_OR_EQUAL : <=
EQUAL : =
NOT_EQUAL : !=
GREATER_OR_EQUAL : >=
GREATER : >
NO_OP : 不比较
*/
/*SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.EQUAL,
Bytes.toBytes("80"));
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("ls")));*/
//查询年龄为80,或name为ls8开头
SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.GREATER_OR_EQUAL,
Bytes.toBytes("80"));
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("ls8")));
//将过滤器放入链中
filterList.addFilter(ageFilter);
filterList.addFilter(nameFilter);
//在使用scan中添加过滤器
Scan scan = new Scan();
scan.setFilter(filterList);
//提交scan查询
ResultScanner scanner = tb.getScanner(scan);
//打印
HbaseUtil.scanData(scanner,null);
//关闭table
HbaseUtil.close(null,tb);
}
}
比较器:
import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 比较器:
*/
public class Demo08_Compator {
public static void main(String[] args) throws IOException {
//获取table对象
Table tb = HbaseUtil.getTable("tb");
//查询年龄为80,或name为ls8开头
SingleColumnValueFilter ageFilter1 = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.GREATER_OR_EQUAL,
Bytes.toBytes("80"));
//字节比较器
SingleColumnValueFilter ageFilter2 = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes("80")));
//字节前缀比较器
SingleColumnValueFilter ageFilter3 = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("8")));
//子字符串比较器 SubstringComparator("12")这个值是列值的一个子字符串即可
SingleColumnValueFilter ageFilter4 = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.EQUAL,
new SubstringComparator("12"));
//12 120 121 122 123 124 125 126 ... 129 112
SingleColumnValueFilter ageFilter5 = new SingleColumnValueFilter(Bytes.toBytes("data"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.EQUAL,
new RegexStringComparator("^[1-2].*$"));
//在使用scan中添加过滤器
Scan scan = new Scan();
scan.setFilter(ageFilter5);
//提交scan查询
ResultScanner scanner = tb.getScanner(scan);
//打印
HbaseUtil.scanData(scanner,null);
//关闭table
HbaseUtil.close(null,tb);
}
}
列比较器
import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 列比较器
*/
public class Demo09_Qualilfire {
public static void main(String[] args) throws IOException {
//获取table对象
Table tb = HbaseUtil.getTable("tb");
//根据列的名称来过滤
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER,
new BinaryComparator(Bytes.toBytes("rst")));
QualifierFilter qualifierFilter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL,
new SubstringComparator("a"));
//在使用scan中添加过滤器
Scan scan = new Scan();
scan.setFilter(qualifierFilter1);
//提交scan查询
ResultScanner scanner = tb.getScanner(scan);
//打印
HbaseUtil.scanData(scanner,null);
//关闭table
HbaseUtil.close(null,tb);
}
}
行过滤器
import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 行过滤器
*/
public class Demo10_RowFilter {
public static void main(String[] args) throws IOException {
//获取table对象
Table tb = HbaseUtil.getTable("tb");
//使用rowkey中的值来进行过滤
RowFilter ls8 = new RowFilter(CompareFilter.CompareOp.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("rk8")));
//在使用scan中添加过滤器
Scan scan = new Scan();
scan.setFilter(ls8);
//提交scan查询
ResultScanner scanner = tb.getScanner(scan);
//打印
HbaseUtil.scanData(scanner,null);
//关闭table
HbaseUtil.close(null,tb);
}
}
其他过滤器
FirstKeyOnlyFilter
ColumnRangeFilter -- 需要起始key,还有是否包含起始key
MultipleColumnPrefixFilter -- 需要一个二维数组
PageFilter -- 指定查询page的条数