zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Hbase 学习(二)各种filter

HBase学习 各种 filter
2023-09-14 09:00:24 时间
今天的主题是Filter,hbase客户端查询的时候,自定义查询filter。 直接上例子吧,不多说别的了,第一个例子是RowFilter的。
Scan scan = new Scan();

scan.addColumn(Bytes.toBytes("colfam1"),

Bytes.toBytes("col-0"));

Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,

 new BinaryComparator(Bytes.toBytes("row-22")));

scan.setFilter(filter1);

ResultScanner scanner1 = table.getScanner(scan);

for (Result res : scanner1) {

 System.out.println(res);

scanner1.close();

Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL,

 new RegexStringComparator(".*-.5"));

scan.setFilter(filter2);

ResultScanner scanner2 = table.getScanner(scan);

for (Result res : scanner2) {

 System.out.println(res);

scanner2.close();

Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,

 new SubstringComparator("-5"));

scan.setFilter(filter3);

ResultScanner scanner3 = table.getScanner(scan);

for (Result res : scanner3) {

 System.out.println(res);

scanner3.close();
第二个例子是QualifierFilter的
Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,

 new BinaryComparator(Bytes.toBytes("col-2")));

Scan scan = new Scan();

scan.setFilter(filter);

ResultScanner scanner = table.getScanner(scan);

for (Result result : scanner) {

 System.out.println(result);

scanner.close();

Get get = new Get(Bytes.toBytes("row-5"));

get.setFilter(filter);

Result result = table.get(get);
第三个例子是ValueFilter
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL,

 new SubstringComparator(".4"));

Scan scan = new Scan();

scan.setFilter(filter);

ResultScanner scanner = table.getScanner(scan);

for (Result result : scanner) {

 for (KeyValue kv : result.raw()) {

 System.out.println("KV: " + kv + ", Value: " +

 Bytes.toString(kv.getValue()));

scanner.close();

Get get = new Get(Bytes.toBytes("row-5"));

get.setFilter(filter);

Result result = table.get(get);

for (KeyValue kv : result.raw()) {

 System.out.println("KV: " + kv + ", Value: " +

 Bytes.toString(kv.getValue()));

}
第四个例子是PageFilter,分页的filter
Filter filter = new PageFilter(15);

int totalRows = 0;

byte[] lastRow = null;

while (true) {

 Scan scan = new Scan();

 scan.setFilter(filter);

 if (lastRow != null) {

 byte[] startRow = Bytes.add(lastRow, POSTFIX);

 System.out.println("start row: " +Bytes.toStringBinary(startRow));

 scan.setStartRow(startRow);

 ResultScanner scanner = table.getScanner(scan); 

 int localRows = 0;

 Result result;

 while ((result = scanner.next()) != null) {

 System.out.println(localRows++ + ": " + result);

 totalRows++;

 lastRow = result.getRow();

 scanner.close();

 if (localRows == 0) break;

System.out.println("total rows: " + totalRows);
第五个例子是InclusiveStopFilter,它是什么意思呢,就是扫描到某个rowkey就停止,下面的例子是从row-3开始扫描,一直扫描到row-5结束。
Filter filter = new

InclusiveStopFilter(Bytes.toBytes("row-5"));

Scan scan = new Scan();

scan.setStartRow(Bytes.toBytes("row-3"));

scan.setFilter(filter);

ResultScanner scanner = table.getScanner(scan);

 for (Result result : scanner) {

 System.out.println(result);

scanner.close();
第六个SingleColumnValueFilter,这个是我们最常用的filter,我觉得很好用。
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("colfam1"),

Bytes.toBytes("col-5"), CompareFilter.CompareOp.NOT_EQUAL,

new SubstringComparator("val-5"));

filter.setFilterIfMissing(true);

Scan scan = new Scan();

scan.setFilter(filter);

ResultScanner scanner = table.getScanner(scan);

for (Result result : scanner) {

 for (KeyValue kv : result.raw()) {

 System.out.println("KV: " + kv + ", Value: " +

 Bytes.toString(kv.getValue()));

scanner.close();

Get get = new Get(Bytes.toBytes("row-6"));

get.setFilter(filter);

Result result = table.get(get);

System.out.println("Result of get: ");

for (KeyValue kv : result.raw()) {

 System.out.println("KV: " + kv + ", Value: " +

 Bytes.toString(kv.getValue()));

}
第七个FilterList,它有两个选项,需要全部通过,还是一个通过就行,MUST_PASS_ALL,MUST_PASS_ONE。
public class CustomFilter extends FilterBase {

 private byte[] value = null;

 private boolean filterRow = true;

 public CustomFilter() {

 super();

 public CustomFilter(byte[] value) {

 this.value = value;

 @Override

 public void reset() {

 this.filterRow = true;

 @Override

 public ReturnCode filterKeyValue(KeyValue kv) {

 if (Bytes.compareTo(value, kv.getValue()) == 0) {

 filterRow = false;

 return ReturnCode.INCLUDE;

 @Override

 public boolean filterRow() {

 return filterRow;

 @Override

 public void write(DataOutput dataOutput) throws IOException {

 Bytes.writeByteArray(dataOutput, this.value);

 @Override

 public void readFields(DataInput dataInput) throws IOException {

 this.value = Bytes.readByteArray(dataInput);

}
这里要讲的是自定义filter,从FilterBase继承。
public class CustomFilter extends FilterBase {

 private byte[] value = null;

 private boolean filterRow = true;

 public CustomFilter() {

 super();

 public CustomFilter(byte[] value) {

 this.value = value;

 @Override

 public void reset() {

 this.filterRow = true;

 @Override

 public ReturnCode filterKeyValue(KeyValue kv) {

 if (Bytes.compareTo(value, kv.getValue()) == 0) {

 filterRow = false;

 return ReturnCode.INCLUDE;

 @Override

 public boolean filterRow() {

 return filterRow;

 @Override

 public void write(DataOutput dataOutput) throws IOException {

 Bytes.writeByteArray(dataOutput, this.value);

 @Override

 public void readFields(DataInput dataInput) throws IOException {

 this.value = Bytes.readByteArray(dataInput);

}
然后打成jar包,要在hbase-env.sh中指明路径。 export  HBASE_CLASSPATH="/hbase/target/hbase-customfilter.jar",然后就可以在客户端中使用它了。
HBase Filter 过滤器之 Comparator 原理及源码学习 HBase所有的比较器实现类都继承于父类ByteArrayComparable,而ByteArrayComparable又实现了Comparable接口;不同功能的比较器差别在于对父类compareTo()方法的重写逻辑不同。 下面分别对HBase Filter默认实现的七大比较器一一进行介绍。 1. BinaryComparator 介绍:二进制比较器,用于按字典顺序比较指定字节数组。 先看一个小例子: public class BinaryComparatorDemo { public static void main(String[] args) {
HBase Filter 过滤器之RowFilter详解 前言:本文详细介绍了HBase RowFilter过滤器Java&Shell API的使用,并贴出了相关示例代码以供参考。RowFilter 基于行键进行过滤,在工作中涉及到需要通过HBase Rowkey进行数据过滤时可以考虑使用它。比较器细节及原理请参照之前的更文:HBase Filter 过滤器之比较器 Comparator 原理及源码学习 一。Java Api public class RowFilterDemo { private static boolean isok = false; private static String tableName
1元包年,阿里云HBase Serverless开启大数据学习与测试的新时代 阿里云HBase Serverless 版是基于HBase,使用Serverless架构构建的一套新型的HBase 服务。 阿里云HBase Serverless版真正把HBase变成了一个服务,用户无需提前规划资源,选择CPU,内存资源数量,购买集群。在应对业务高峰,业务空间增长时,也无需进行扩容
HBase全网最佳学习资料汇总 HBase这几年在国内使用的越来越广泛,在一定规模的企业中几乎是必备存储引擎,互联网企业阿里巴巴、京东、小米都有数千台的HBase集群,中国电信的话单、中国人寿的保单都是存储在HBase中。注意大公司有数十个数百个HBase集群,此点跟Hadoop集群很不相同。
hive_学习_02_hive整合hbase(失败) 一、前言 本文承接上一篇:hive_学习_01_hive环境搭建(单机) ,主要是记录 hive 整合hbase的流程 二、环境准备 1.环境准备 操作系统 : linux CentOS 6.
hbase_学习_01_HBase环境搭建(单机) 一、前言 本文承接上一篇:hadoop_学习_02_Hadoop环境搭建(单机)  ,主要是搭建HBase的单机环境 二、环境准备 hbase 的下载来源有: 官方版本:http://archive.apache.org/dist/hbase/ CDH版本:http://archive.cloudera.com/cdh5 企业应用一般选择CDH版本,因为比较稳定。
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载