desehawk 发表于 2018-5-21 18:30:37

hbase过滤器汇总【查询汇总】


什么是过滤器,就是我们常说的查询。过滤有很多种。有行查询,列查询,rowkey查询。特别是rowkey,我们在设计rowkey的时候,为了防止热点,前面加了salt,比如前面加了随机数或则倒序等等。导致我们不知道该如何查询。这就是用到了RowFilter
Filter 的继承结构
[*]Filter

[*]FilterBase

[*]CompareFilter

[*]RowFilter
[*]FamilyFilter
[*]QualifierFilter
[*]ValueFilter
[*]DependentColumnFilter
[*]SingleColumnValueFilter

[*]SingleColumnValueExcludeFilter
[*]PrefixFilter
[*]PageFilter (*.fiter)
[*]KeyOnlyFilter
[*]FirstKeyOnlyFilter

[*]FirstKeyValueMatchingQualifiersFilter
[*]InclusiveStopFilter
[*]TimestampsFilter
[*]ColumnCountGetFilter
[*]ColumnPaginationFilter
[*]ColumnPrefixFilter
[*]RandomRowFilter
[*]ColumnRangeFilter
[*]MultipleColumnPrefixFilter
[*]MultiRowRangeFilter
[*]FuzzyRowFilter
[*]SkipFilter
[*]WhileMatchFilter
[*]FilterList
[*]FilterWrapper





desehawk 发表于 2018-5-21 18:33:33

他们各自如何使用
CompareFilter
CompareFilter 返回匹配的行。

构造函数:

public CompareFilter(final CompareOp compareOp, final ByteArrayComparable comparator) {
    this.compareOp = compareOp;
    this.comparator = comparator;
}

比较运算符:
public enum CompareOp {
    /** 小于 */
    LESS,
    /** 小于等于 */
    LESS_OR_EQUAL,
    /** 等于 */
    EQUAL,
    /** 不等于 */
    NOT_EQUAL,
    /** 大于等于 */
    GREATER_OR_EQUAL,
    /** 大于 */
    GREATER,
    /** 不操作 */
    NO_OP
}


比较器:

BinaryComparator 使用Bytes.compareTo()进行比较
BinaryPrefixComparator 使用 Bytes.compareTo() 进行前缀匹配
NullComparator 不做匹配,只判断当前值是否为 null
LongComparator longValue.compareTo(Bytes.toLong(value))
一下三种只能 使用 EQUAL 和 NOT_EQUAL 运算符

BitComparator 使用 异或非 进行比较
RegexStringComparator 正则匹配
SubstringComparator 子串匹配




desehawk 发表于 2018-5-21 18:35:01

RowFilter筛选出 匹配的行键FamilyFilter筛选出 匹配的列族QualifierFilter筛选出 匹配的列限定符ValueFilter筛选出 匹配的值专用过滤器SingleColumnValueFilter与 ValueFilter 类似,但是可以值针对某个列限定符里面的值进行过滤。SingleColumnValueExcludeFilter与SingleColumnValueFilter 的不同之处在于,不返回指定的列限定符 所有的列PrefixFilter匹配到的行键前缀的行会被返回。当遇到比前缀大的行时,扫描结束PageFilter从起始行键扫描,返回指定的条数。
翻页的时候客户端需要记录上次返回的会有一个行键,下次作为起始行键。
起始行键是包含在返回结果中的,如果不想包含起始行键,在行键后拼接一个0字节的数组。scan.setStopRow(Bytes.padTail(someBytes, 0));
// 或
scan.setStopRow(Bytes.add(someBytes, new byte));










desehawk 发表于 2018-5-21 18:36:40

RowFilter筛选出 匹配的行键FamilyFilter筛选出 匹配的列族QualifierFilter筛选出 匹配的列限定符ValueFilter筛选出 匹配的值专用过滤器SingleColumnValueFilter与 ValueFilter 类似,但是可以值针对某个列限定符里面的值进行过滤。SingleColumnValueExcludeFilter与SingleColumnValueFilter 的不同之处在于,不返回指定的列限定符 所有的列PrefixFilter匹配到的行键前缀的行会被返回。当遇到比前缀大的行时,扫描结束PageFilter从起始行键扫描,返回指定的条数。
翻页的时候客户端需要记录上次返回的会有一个行键,下次作为起始行键。
起始行键是包含在返回结果中的,如果不想包含起始行键,在行键后拼接一个0字节的数组。scan.setStopRow(Bytes.padTail(someBytes, 0));
// 或
scan.setStopRow(Bytes.add(someBytes, new byte));

KeyOnlyFilter这个过滤器的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用;FirstKeyOnlyFilter只返回第一个列限定符所在的列FirstKeyValueMatchingQualifiersFilter通过设置一组需要匹配的列,只要匹配到任意一个列就会停止这一行的扫描操作进行下一行的扫描。InclusiveStopFilterscan 的时候开始行被包含在内,但是结束行被排除在外,使用该过滤器,会返回结束行。TimestampsFilter获取指定的时间戳集合
scan.setTimeRange() 可以指定时间戳范围ColumnCountGetFilter限制 Get 操作返回的列数。
如果某一个行的列数超过限定的值,会停止扫描,所以不适合 scan 使用ColumnPaginationFilterPageFilter 是基于行分页,该过滤器是基于列分页ColumnPrefixFilter与PrefixFilter类似,该过滤器可以前缀匹配 列限定符RandomRowFilter根据设定的概率随机选择返回的行。
过滤器内部调用 Java 的随机方法产生一个随机数,如果产生的随机数小于设定的概率则包含改行,否则排除。
如果设定概率小于0,则全部排除,如果设置概率大于1,则全部包含ColumnRangeFilter根据指定的列的范围进行筛选MultipleColumnPrefixFilter过个列前缀过滤,构造方法是一个前缀数组MultiRowRangeFilter多个行键过滤,构造方法是一个范围列表
FuzzyRowFilter
FuzzyRowFilter 是对 行键模糊匹配 的优化版。是扫描更加快速。

附加过滤器SkipFilter该过滤器用于包装其它过滤器,匹配的过滤器,被该过滤器包装后会跳过。相当于 不等于WhileMatchFilter该过滤器用于包装其它过滤器,返回从匹配开始,第一次遇到不匹配的之前的匹配到的数据。FilterList多个过滤器可以组合使用,组合情况有一下两种public static enum Operator {
    /** 所有过滤器都必须满足 */
    MUST_PASS_ALL,
    /** 只用满足其中一个就行 */
    MUST_PASS_ONE
}

只返回满足条件的行键信息
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(new PrefixFilter(Bytes.toBytes("dev")));
filterList.addFilter(new KeyOnlyFilter());

jinwensc 发表于 2018-5-21 20:25:58

有没有知道Hbase Rest Api 中MultipleColumnPrefixFilter的请求体是怎么样写的?

恋枫缩影 发表于 2018-5-22 09:13:20

学习了

美丽天空 发表于 2018-5-22 09:15:24

感谢分享
页: [1]
查看完整版本: hbase过滤器汇总【查询汇总】