HBase过滤器的使用
一、常用过滤器:
1、数据准备:
Rowkey:001 Family:Quilfifier address value: 昆明市西山区
Rowkey:001 Family:Quilfifier age value: 23
Rowkey:001 Family:Quilfifier name value: 小明
Rowkey:001 Family:Quilfifier personType value: 布控人员,涉恐人员,线索人员
Rowkey:001 Family:Quilfifier zjhm value: 620302199822332832
Rowkey:002 Family:Quilfifier address value: 昆明市西山区福海路
Rowkey:002 Family:Quilfifier age value: 33
Rowkey:002 Family:Quilfifier name value: 小李
Rowkey:002 Family:Quilfifier personType value: 重点人员,涉恐人员,线索人员
Rowkey:002 Family:Quilfifier zjhm value: 620302199822332442
Rowkey:003 Family:Quilfifier address value: 昆明市西山区福海路
Rowkey:003 Family:Quilfifier age value: 34
Rowkey:003 Family:Quilfifier name value: 小王
Rowkey:003 Family:Quilfifier personType value: 重点人员,涉恐人员,在控人员
Rowkey:003 Family:Quilfifier zjhm value: 620302192398432442
Rowkey:004 Family:Quilfifier address value: 昆明市滇池路
Rowkey:004 Family:Quilfifier age value: 45
Rowkey:004 Family:Quilfifier name value: 小花
Rowkey:004 Family:Quilfifier personType value: 涉恐人员,线索人员
Rowkey:004 Family:Quilfifier zjhm value: 643020304050403436
Rowkey:005 Family:Quilfifier address value: 云南省西双版纳
Rowkey:005 Family:Quilfifier age value: 60
Rowkey:005 Family:Quilfifier name value: 小马
Rowkey:005 Family:Quilfifier personType value: ,涉案人员,涉恐人员,线索人员
Rowkey:005 Family:Quilfifier zjhm value: 643020302938413436
Rowkey:006 Family:Quilfifier address value: 北京市朝阳区
Rowkey:006 Family:Quilfifier age value: 66
Rowkey:006 Family:Quilfifier name value: 大壮
Rowkey:006 Family:Quilfifier personType value: 良民
Rowkey:006 Family:Quilfifier zjhm value: 673747322344384456
2、过滤器的使用:
package HBase; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class Operator {
public static Admin admin = null;
public static Connection conn = null; public Connection getConn() throws IOException { Configuration hbaseConf = HBaseConfiguration.create();
hbaseConf.set("hbase.zookeeper.quorum","master:2181,slave1:2181,slave2:2181");
hbaseConf.set("hbase.zookeeper.quorum", "master:2181");
Connection HbaseConn = ConnectionFactory.createConnection(hbaseConf);
return HbaseConn;
} public Operator() {
try {
conn = Hbase.getConnection();
admin = conn.getAdmin();
} catch (Exception e) {
e.getMessage();
}
} public static void main(String[] args) throws Exception {
Operator operator = new Operator();
operator.filter("person");
// operator.pageFilter("person");
} /**
* SingleColumnValueFilter和SingleColumnValueExcludeFilter
* 用来查找并返回指定条件的列的数据
* a,如果查找时没有该列,两种filter都会把该行所有数据返回
* b,如果查找时有该列,但是不符合条件,则该行所有列都不返回
* c,如果找到该列,并且符合条件,前者返回所有列,后者返回除该列以外的所有
*/
public void filter(String tableName) throws Exception {
Table table = conn.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
//SingleColumnValueFilter:二进制比较器,完整匹配字节数组,返回匹配到的整行
Filter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("良民")));
//SingleColumnValueFilter:二进制比较器,只比较前缀是否相同,返回的是匹配到的整行,并非每一列
Filter filter0 = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("重点")));
//SingleColumnValueFilter:匹配正则表达式,返回匹配到的整行
Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*重点人员.*"));
//SingleColumnValueFilter:匹配是否包含子串,大小写不敏感,返回匹配到的整行
Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("线索人员"));
//查询出匹配的行,但是过滤掉所匹配的列
Filter filter3 = new SingleColumnValueExcludeFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("线索人员"));
//RandomRowFilter:按照一定的几率来返回随机的结果
Filter filter4 = new RandomRowFilter((float) 0.5);
//RowFilter:删选出指定开头行健的所有匹配的行
Filter filter5 = new PrefixFilter(Bytes.toBytes("00"));
//ValueFilter:按照value全数据库搜索,返回的是所匹配值的某一列,并非某一行
Filter filter6 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("23")));
//按family(列族)查找,取回所有符合条件的“family”
Filter filter7 = new FamilyFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("info")));
//KeyOnlyFilter:返回所有的行,但是值全是空
Filter filter8 = new KeyOnlyFilter();
//ColumnsPrefixFilter:按照列明的前缀来筛选单元格,返回所有行的指定某列
Filter filter9 = new ColumnPrefixFilter(Bytes.toBytes("ag"));
//FirsterKeyOnlyFilter:返回的结果集中只包含第一列的而数据,在找到每一行的第一列后就会停止扫描
Filter filter10 = new FirstKeyOnlyFilter();
//InclusiveStopFilter:返回截止到指定行的所有数据,包含最后一行(005)。使用startRow以及stopRow的时候是左闭右开
Filter filter11 = new InclusiveStopFilter(Bytes.toBytes("005"));
//cloumnCountGetFilter:返回每行最多返回多少列,在一行列数超过一定数量的时候,结束整个表的扫描
Filter filter12 = new ColumnCountGetFilter(6);
//SkipFilter:附加过滤器,如果发现一行中的某一列不符合条件,则整行就会被过滤
Filter filter13 = new SkipFilter(filter6);
//WhileMatchFilter:过滤数据,直到不符合条件,停止扫扫描,返回的是符合条件的每一列数据
Filter filter14 = new WhileMatchFilter(filter6);
//QualifierFilter:列名过滤,返回指定的每一列数据
Filter filter15 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("age")));
//MultipleColumnPrefixFilter:与ColumnsPrefixFilter不同的是可以指定多个列明的前缀
byte[][] prefixs = new byte[][]{Bytes.toBytes("ag"), Bytes.toBytes("na")};
Filter filter16 = new MultipleColumnPrefixFilter(prefixs);
//ColumnRangeFilter:可以进行高效的列名内部扫描,因为列名是已经按照字典顺序排好的,返回[minColumn,maxColumn]之间的数据
boolean minColumnlnclusive = true;
boolean maxColumnlnclusive = true;
Filter filter17 = new ColumnRangeFilter(Bytes.toBytes("name"), minColumnlnclusive, Bytes.toBytes("zjhm"), maxColumnlnclusive);
//DependentColumnFilter:尝试找到该列所在的每一行,并返回改行具有相同时间戳的全部键值对,返回的是具体的某一列,并非某一行
Filter filter18 = new DependentColumnFilter(Bytes.toBytes("info"), Bytes.toBytes("age"));
//RandomRowFilter:随机选择一行的过滤器,chance是一个浮点数
float chance = 0.6f;
Filter filter19 = new RandomRowFilter(chance);
//ColumnPaginationFilter:按列分页过滤器,针对列数量很多的情况使用
int limit = 3;
int columnOffset = 0;
Filter filter20 = new ColumnPaginationFilter(limit, columnOffset);
//综合过滤器使用
List<Filter> filters = new ArrayList<>();
filters.add(filter1);
filters.add(filter2);
FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); ((SingleColumnValueFilter) filter1).setFilterIfMissing(false);
scan.setFilter(filter20);
ResultScanner scanner = table.getScanner(scan);
for (Result r : scanner) {
for (Cell cell : r.rawCells()) {
System.out.println(
"Rowkey:" + Bytes.toString(r.getRow()) + "\t" +
"Family:Quilfifier " + Bytes.toString(CellUtil.cloneQualifier(cell)) + "\t" +
"value: " + Bytes.toString(CellUtil.cloneValue(cell))
);
}
}
scanner.close();
} /**
* 分页过滤器
* PageFilter:用于按行分页
*/
public void pageFilter(String tableName) throws IOException {
Table table = conn.getTable(TableName.valueOf(tableName));
long pageSize = 2;
int totalRowsCount = 0;
PageFilter pageFilter = new PageFilter(pageSize);
byte[] lastRow = null;
while (true) {
Scan scan = new Scan();
scan.setFilter(pageFilter);
if (lastRow != null) {
byte[] posfix = Bytes.toBytes("002");
byte[] startRow = Bytes.add(lastRow, posfix);
scan.setStartRow(startRow);
System.out.println("start row :" + Bytes.toString(startRow));
}
ResultScanner scanner = table.getScanner(scan);
int localRowsCount = 0;
for (Result result : scanner) {
System.out.println(localRowsCount++ + ":" + result);
totalRowsCount++;
lastRow = result.getRow();
}
scanner.close();
if (localRowsCount == 0) break;
}
System.out.println("total rows is :" + totalRowsCount);
}
}
3、自定义过滤器
--后面在补
HBase过滤器的使用的更多相关文章
- HBase学习——4.HBase过滤器
1.过滤器 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filter可以根据簇.列.版本等更多的条件来对数据进行过滤,基于Hbase本身提 ...
- Hadoop生态圈-Hbase过滤器(Filter)
Hadoop生态圈-Hbase过滤器(Filter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- HBase(七)Hbase过滤器
一.过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filter可以根据簇.列.版本等更多的条件来对数据进行过滤,基于 ...
- Hbase过滤器
Hbase过滤器简介 HBase的基本API,包括增.删.改.查等,增.删都是相对简单的操作,与传统的RDBMS相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查 ...
- HBase 学习之路(七)——HBase过滤器详解
一.HBase过滤器简介 Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predica ...
- HBase 系列(七)——HBase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- 入门大数据---Hbase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- Hbase过滤器Filter的使用心得(爬坑经验)
Hbase 的过滤器是个好东西.. 给这种非关系型数据库本来不能复杂查询的情况得到了很好的扩展..提供了很多的帮助.. 但是Filter的种类何其之多..让人眼花缭乱.. 譬如..分页类型的PageF ...
- hbase 过滤器 rowfilter
HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...
随机推荐
- C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast
关于强制类型转换的问题,许多书都讨论过,写的最具体的是C++之父的<C++的设计和演化>. 最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_c ...
- Window丢失api-ms-win-crt-runtime-l1-1-0.dll
一.现象api-ms-win-crt-runtime-l1-1-0.dll 丢失 二.第一种方案,缺什么补什么http://download.csdn.net/download/su749520/10 ...
- 解决bootstrap 模态框 数据清除 验证清空
$("#switchModel").on("hidden.bs.modal", function () { $('#ware-form')[0].reset() ...
- 微信小程序返回上一页的方法并传参
这个有点像子-->父传值 第一步,在子页面点击上一步或者保存数据请求成功以后添加如下代码. var pages = getCurrentPages(); var prevPage = pages ...
- Hibernate查询操作
操作前需要创建好Hibernate项目,创建项目,可参考:http://www.cnblogs.com/zhaojinyan/p/9336174.html 一下的例子是从其他贴子粘过来的(知识无国界! ...
- COM中参数标识
- Delphi中有关窗口绘制
Invalidate方法通知Windows应该重新绘制表单的整个表面.最重要的是Invalidate不会立即强制执行绘制操作. Windows只是存储请求,并且只会响应它当前程序完全执行后,并且只要系 ...
- Spring Boot 全局异常捕获
import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.Control ...
- IE缓存清除
原文转载自:http://blog.csdn.net/whatday/article/details/7566925 首先: 在 stdafx.h中要加入: #include "atlba ...
- zabbix 乱码问题
一.乱码原因 查看cpu负载,中文乱码如下 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 二.解决zabbix乱码方法 2.1 上传字体文件到zabbix中 找到本地 ...