filter 需要实现Filter 或者继承FilterBase
  1. @InterfaceAudience.Public
  2. @InterfaceStability.Stable
  3. public abstract class Filter {
  4. //返回码
  5. public enum ReturnCode {
  6. INCLUDE, //结果中包含着一样
  7. INCLUDE_AND_NEXT_COL, //包含着这样一行,跳到下一行比较
  8. SKIP, //跳到下一个keyvalue 并进行处理
  9. NEXT_COL, //跳过当前一col
  10. NEXT_ROW, //跳过当前一行
  11. SEEK_NEXT_USING_HINT, //跳到下一个满足地方,需要调用getNextKeyHint()
  12. }
  13. protected transient boolean reversed;
  14. abstract public void reset() throws IOException;
  15. //判断行健是否满足,不满足可以跳过,避免其他检查:比如前缀过滤器
  16. abstract public boolean filterRowKey(byte[] buffer, int offset, int length) throws IOException;
  17. //这个过滤器可以提前结束
  18. abstract public boolean filterAllRemaining() throws IOException;
  19. //对cell处理,
  20. abstract public ReturnCode filterKeyValue(final Cell v) throws IOException;
  21. abstract public Cell transformCell(final Cell v) throws IOException;
  22. @Deprecated // use Cell transformCell(final Cell)
  23. abstract public KeyValue transform(final KeyValue currentKV) throws IOException;
  24. //经过前面处理后,如果还有数据,将对当前行一起处理, 比如依赖过去器
  25. abstract public void filterRowCells(List<Cell> kvs) throws IOException;
  26. abstract public boolean hasFilterRow();
  27. //经过这么多流程如果还有数据,会去检查一下数据的要求。比如pagefilter 是否已经够一页了
  28. abstract public boolean filterRow() throws IOException;
  29. @Deprecated
  30. abstract public KeyValue getNextKeyHint(final KeyValue currentKV) throws IOException;
  31. abstract public Cell getNextCellHint(final Cell currentKV) throws IOException;
  32. abstract public boolean isFamilyEssential(byte[] name) throws IOException;
  33. abstract public byte[] toByteArray() throws IOException;
  34. public static Filter parseFrom(final byte [] pbBytes) throws DeserializationException {
  35. throw new DeserializationException(
  36. "parseFrom called on base Filter, but should be called on derived type");
  37. }
  38. abstract boolean areSerializedFieldsEqual(Filter other);
  39. public void setReversed(boolean reversed) {
  40. this.reversed = reversed;
  41. }
  42. public boolean isReversed() {
  43. return this.reversed;
  44. }
  45. }
流程如下:
scan,或者get是调用的入口
基本流程就是下面 一样,但是没有看到fiterKeyValue,如果你们找到了,告诉我一声。
  1. private boolean nextInternal(List<Cell> results, ScannerContext scannerContext)
  2. throws IOException {
  3. while (true) {
  4.  
  5. boolean stopRow = isStopRow(currentRow, offset, length);
  6. boolean hasFilterRow = this.filter != null && this.filter.hasFilterRow();
  7. if (hasFilterRow) {
  8. if (LOG.isTraceEnabled()) {
  9. LOG.trace("filter#hasFilterRow is true which prevents partial results from being "
  10. + " formed. Changing scope of limits that may create partials");
  11. }
  12. scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);
  13. scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);
  14. }
  15. if (filterRowKey(currentRow, offset, length)) {
  16. incrementCountOfRowsFilteredMetric(scannerContext);
  17. // early check, see HBASE-16296
  18. //filterAllRemaining 实际调用
  19. if (isFilterDoneInternal()) {
  20. return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
  21. }
  22. incrementCountOfRowsScannedMetric(scannerContext);
  23. //里面会调用filter.reset();
  24. boolean moreRows = nextRow(scannerContext, currentRow, offset, length);
  25. if (!moreRows) {
  26. return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
  27. }
  28. results.clear();
  29. continue;
  30. }
  31. populateResult(results, this.storeHeap, scannerContext, currentRow, offset, length);
  32. Cell nextKv = this.storeHeap.peek();
  33. stopRow = nextKv == null ||
  34. isStopRow(nextKv.getRowArray(), nextKv.getRowOffset(), nextKv.getRowLength());
  35. final boolean isEmptyRow = results.isEmpty();
    1. FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;
  36. if (hasFilterRow) {
  37. //会调用filterRowCells(List) 和filterRowCells(cell)
  38. ret = filter.filterRowCellsWithRet(results);
  39. long timeProgress = scannerContext.getTimeProgress();
  40. if (scannerContext.getKeepProgress()) {
  41. scannerContext.setProgress(initialBatchProgress, initialSizeProgress,
  42. initialTimeProgress);
  43. } else {
  44. scannerContext.clearProgress();
  45. }
  46. scannerContext.setTimeProgress(timeProgress);
  47. scannerContext.incrementBatchProgress(results.size());
  48. for (Cell cell : results) {
  49. scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOfWithoutTags(cell));
  50. }
  51. }
  52. if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {
  53. incrementCountOfRowsFilteredMetric(scannerContext);
  54. results.clear();
  55. boolean moreRows = nextRow(scannerContext, currentRow, offset, length);
  56. if (!moreRows) {
  57. return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
  58. }
  59. if (!stopRow) continue;
  60. return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
  61. }
  62. if (this.joinedHeap != null) {
  63. boolean mayHaveData = joinedHeapMayHaveData(currentRow, offset, length);
  64. if (mayHaveData) {
  65. joinedContinuationRow = current;
  66. populateFromJoinedHeap(results, scannerContext);
  67. if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {
  68. return true;
  69. }
  70. }
  71. }
  72. } else {
  73. populateFromJoinedHeap(results, scannerContext);
  74. if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {
  75. return true;
  76. }
  77. }
  78. if (stopRow) {
  79. return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
  80. } else {
  81. return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();
  82. }
  83. }
  84. }
就这样。
自定义完成后,打成jar ,需要export export HBASE_CLAPSS 
或者将jar 放到hbase 的安装目录的lib下面,重启hbase

hbase 源代码解析(21) 自定义过滤器相关推荐

  1. 【django】过滤器和自定义过滤器

    一.过滤器语法 语法如下: 使⽤管道符号 | 来应⽤过滤器,⽤于进⾏计算.转换操作,可以使⽤在变量.标签中. 如果过滤器需要参数,则使⽤冒号:传递参数. 变量 | 过滤器:参数 列举⼏个如下: saf ...

  2. phoenix 3.1 + hbase 0.94.21 的安装和使用

    Apache Phoenix 是 HBase 的 SQL 驱动.Phoenix 使得 HBase 支持通过 JDBC 的方式进行访问,并将你的 SQL 查询转成 HBase 的扫描和相应的动作. 兼容 ...

  3. Django中自定义过滤器的使用

    我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文 ...

  4. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  5. 物联网架构成长之路(35)-利用Netty解析物联网自定义协议

    一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...

  6. SpringMVC配置自定义过滤器

    SpringMVC配置自定义过滤器 环境 开发工具: idea2019.3.5 springmvc版本: 5.1.9.RELEASE <dependency><groupId> ...

  7. java根据Stack栈实现公式解析和自定义函数(一)

    我是看到了大佬的博客还能这样解析,我们来解析一下思路并扩展一下,传送门:java实现公式解析 1. Stack的介绍 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数 ...

  8. eMule源代码解析 -1

    eMule源代码解析 -1 2006-10-16 17:37 eMule的官方首页上写着:2002年05月13日 一个叫做 Merkur 的人,他不满意原始eDonkey2000客户端并且坚信他能够做 ...

  9. 【AngularJS】—— 9 自定义过滤器

    AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用 ...

最新文章

  1. ios php range,PHP range() 函数 - PHP 基础教程
  2. wxWidgets:添加状态栏
  3. BOOST_PREDEF_TESTED_AT宏相关的测试程序
  4. mysql读锁和写锁
  5. C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
  6. 【计算机网络复习 数据链路层】3.4.3 后退N帧协议(GBN)
  7. celery实现任务统一收集、分发执行
  8. 001_深度剖析什么是 SLI、SLO和SLA?
  9. Android 面试 缓存,荐【经典面试题】七大缓存经典问题...
  10. java GC 参数
  11. 2020-11-13 02_计算机视觉基础
  12. MySQL 联合查询
  13. SSM项目实战之十二:用户信息的修改
  14. [朴智妍][또르르][轱辘轱辘]
  15. 基于 OpenVINO™ 的 AI 视觉应用基础课学习笔记(三)深度学习简介
  16. Android Studio修改工程项目编码,修正运行程序乱码问题
  17. 信号时域频域特征公式
  18. JSD-2204-续Docker命令-布隆过滤器的测试-秒杀业务完善-ELK-配置中心-Day18
  19. 彻底解决jdbc数据库连接超时重试-communication link failure的正确姿势
  20. 【ELM】动态自适应可变加权极限学习机ELM预测(Matlab代码实现)

热门文章

  1. inter酷睿后缀含义
  2. Eversipn STT-MRAM的MJT细胞
  3. ORACLE的统计分析
  4. Mysql删除文件夹中的data文件(删除数据)
  5. android 10.0 禁止安装apk
  6. setMouseTracking(true)无法跟踪鼠标事件
  7. 如何在渗透测试中尽可能隐藏自己-proxychains4使用配置教程
  8. 【STM32】标准库与HAL库对照学习教程六--位带操作
  9. 【博客496】k8s dns解析与服务发现原理
  10. 备案注销申请表_怎么注销单个网站备案?