hbase 源代码解析(21) 自定义过滤器
@InterfaceAudience.Public
@InterfaceStability.Stable
public abstract class Filter {
//返回码
public enum ReturnCode {
INCLUDE, //结果中包含着一样
INCLUDE_AND_NEXT_COL, //包含着这样一行,跳到下一行比较
SKIP, //跳到下一个keyvalue 并进行处理
NEXT_COL, //跳过当前一col
NEXT_ROW, //跳过当前一行
SEEK_NEXT_USING_HINT, //跳到下一个满足地方,需要调用getNextKeyHint()
}
protected transient boolean reversed;
abstract public void reset() throws IOException;
//判断行健是否满足,不满足可以跳过,避免其他检查:比如前缀过滤器
abstract public boolean filterRowKey(byte[] buffer, int offset, int length) throws IOException;
//这个过滤器可以提前结束
abstract public boolean filterAllRemaining() throws IOException;
- //对cell处理,
abstract public ReturnCode filterKeyValue(final Cell v) throws IOException;
- abstract public Cell transformCell(final Cell v) throws IOException;
@Deprecated // use Cell transformCell(final Cell)
abstract public KeyValue transform(final KeyValue currentKV) throws IOException;
//经过前面处理后,如果还有数据,将对当前行一起处理, 比如依赖过去器
abstract public void filterRowCells(List<Cell> kvs) throws IOException;
abstract public boolean hasFilterRow();
//经过这么多流程如果还有数据,会去检查一下数据的要求。比如pagefilter 是否已经够一页了
abstract public boolean filterRow() throws IOException;
@Deprecated
abstract public KeyValue getNextKeyHint(final KeyValue currentKV) throws IOException;
abstract public Cell getNextCellHint(final Cell currentKV) throws IOException;
abstract public boolean isFamilyEssential(byte[] name) throws IOException;
abstract public byte[] toByteArray() throws IOException;
public static Filter parseFrom(final byte [] pbBytes) throws DeserializationException {
throw new DeserializationException(
"parseFrom called on base Filter, but should be called on derived type");
}
abstract boolean areSerializedFieldsEqual(Filter other);
public void setReversed(boolean reversed) {
this.reversed = reversed;
}
- public boolean isReversed() {
return this.reversed;
}
}
private boolean nextInternal(List<Cell> results, ScannerContext scannerContext)
throws IOException {
while (true) {
- boolean stopRow = isStopRow(currentRow, offset, length);
boolean hasFilterRow = this.filter != null && this.filter.hasFilterRow();
if (hasFilterRow) {
if (LOG.isTraceEnabled()) {
LOG.trace("filter#hasFilterRow is true which prevents partial results from being "
+ " formed. Changing scope of limits that may create partials");
}
scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);
scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);
}
if (filterRowKey(currentRow, offset, length)) {
incrementCountOfRowsFilteredMetric(scannerContext);
// early check, see HBASE-16296
- //filterAllRemaining 实际调用
if (isFilterDoneInternal()) {
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
}
- incrementCountOfRowsScannedMetric(scannerContext);
- //里面会调用filter.reset();
boolean moreRows = nextRow(scannerContext, currentRow, offset, length);
if (!moreRows) {
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
}
results.clear();
continue;
}
populateResult(results, this.storeHeap, scannerContext, currentRow, offset, length);
- Cell nextKv = this.storeHeap.peek();
stopRow = nextKv == null ||
isStopRow(nextKv.getRowArray(), nextKv.getRowOffset(), nextKv.getRowLength());
final boolean isEmptyRow = results.isEmpty();
- FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;
if (hasFilterRow) {
//会调用
filterRowCells(List) 和filterRowCells(cell)ret = filter.filterRowCellsWithRet(results);
- long timeProgress = scannerContext.getTimeProgress();
if (scannerContext.getKeepProgress()) {
scannerContext.setProgress(initialBatchProgress, initialSizeProgress,
initialTimeProgress);
} else {
scannerContext.clearProgress();
}
scannerContext.setTimeProgress(timeProgress);
scannerContext.incrementBatchProgress(results.size());
for (Cell cell : results) {
scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOfWithoutTags(cell));
}
}
if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {
incrementCountOfRowsFilteredMetric(scannerContext);
results.clear();
boolean moreRows = nextRow(scannerContext, currentRow, offset, length);
if (!moreRows) {
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
}
- if (!stopRow) continue;
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
}
- if (this.joinedHeap != null) {
boolean mayHaveData = joinedHeapMayHaveData(currentRow, offset, length);
if (mayHaveData) {
joinedContinuationRow = current;
populateFromJoinedHeap(results, scannerContext);
if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {
return true;
}
}
}
} else {
- populateFromJoinedHeap(results, scannerContext);
if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {
return true;
}
}
if (stopRow) {
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
} else {
return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();
}
}
}
hbase 源代码解析(21) 自定义过滤器相关推荐
- 【django】过滤器和自定义过滤器
一.过滤器语法 语法如下: 使⽤管道符号 | 来应⽤过滤器,⽤于进⾏计算.转换操作,可以使⽤在变量.标签中. 如果过滤器需要参数,则使⽤冒号:传递参数. 变量 | 过滤器:参数 列举⼏个如下: saf ...
- phoenix 3.1 + hbase 0.94.21 的安装和使用
Apache Phoenix 是 HBase 的 SQL 驱动.Phoenix 使得 HBase 支持通过 JDBC 的方式进行访问,并将你的 SQL 查询转成 HBase 的扫描和相应的动作. 兼容 ...
- Django中自定义过滤器的使用
我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文 ...
- asp.net MVC之 自定义过滤器(Filter)
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- 物联网架构成长之路(35)-利用Netty解析物联网自定义协议
一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...
- SpringMVC配置自定义过滤器
SpringMVC配置自定义过滤器 环境 开发工具: idea2019.3.5 springmvc版本: 5.1.9.RELEASE <dependency><groupId> ...
- java根据Stack栈实现公式解析和自定义函数(一)
我是看到了大佬的博客还能这样解析,我们来解析一下思路并扩展一下,传送门:java实现公式解析 1. Stack的介绍 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数 ...
- eMule源代码解析 -1
eMule源代码解析 -1 2006-10-16 17:37 eMule的官方首页上写着:2002年05月13日 一个叫做 Merkur 的人,他不满意原始eDonkey2000客户端并且坚信他能够做 ...
- 【AngularJS】—— 9 自定义过滤器
AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用 ...
最新文章
- ios php range,PHP range() 函数 - PHP 基础教程
- wxWidgets:添加状态栏
- BOOST_PREDEF_TESTED_AT宏相关的测试程序
- mysql读锁和写锁
- C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
- 【计算机网络复习 数据链路层】3.4.3 后退N帧协议(GBN)
- celery实现任务统一收集、分发执行
- 001_深度剖析什么是 SLI、SLO和SLA?
- Android 面试 缓存,荐【经典面试题】七大缓存经典问题...
- java GC 参数
- 2020-11-13 02_计算机视觉基础
- MySQL 联合查询
- SSM项目实战之十二:用户信息的修改
- [朴智妍][또르르][轱辘轱辘]
- 基于 OpenVINO™ 的 AI 视觉应用基础课学习笔记(三)深度学习简介
- Android Studio修改工程项目编码,修正运行程序乱码问题
- 信号时域频域特征公式
- JSD-2204-续Docker命令-布隆过滤器的测试-秒杀业务完善-ELK-配置中心-Day18
- 彻底解决jdbc数据库连接超时重试-communication link failure的正确姿势
- 【ELM】动态自适应可变加权极限学习机ELM预测(Matlab代码实现)