繁体   English   中英

HBase - 带偏移的值过滤器?

[英]HBase - value filter with offset?

假设我有三行,其中包含以下值:

+------+----------+
| row  | f1:c1    |
+------+----------+
| row1 | \x00\x00 |
| row2 | \x01\x00 |
| row3 | \x03\x01 |
+------+----------+

是否可以选择使用\\x00作为值的第二个字节的行(例如, row1row2 )?

进一步说明

我有一个不可变对象,它由几个UUID组成,作为我实体的一部分。 由于UUID具有固定长度,因此最有效的存储方式是将所有部分连接成单个字节数组并将其存储在单个列中。

但是,我必须能够根据所述对象的特定字段选择行。 这在理论上非常简单:我需要做的就是将我的列值取特定的偏移量,并将接下来的16个字节与搜索值进行比较。

事实上, ByteArrayComparable已经有点像这样。 它需要一个指向值开始的偏移量,似乎我只需要在其上添加额外的偏移量。 但我无法弄清楚如何做到这一点。

总而言之,在我看来,这似乎是一个广泛适用的用例。 所以必须有办法做到这一点,除非我遗漏了一些东西。

PS我知道我可以用RegexStringComparator达到我想要的RegexStringComparator但这看起来非常低效。

UPDATE

HBase支持自定义过滤器,非常适合我的情况。 不幸的是,由于hbase.dynamic.jars.dirhbase.use.dynamic.jar在我的配置中不存在(我的版本是2.0.1),因此我找到的所有文档都显得过时了。

更新2

我设法用自定义过滤器解决了这个问题。 看来他们删除了hbase.dynamic.jars.dirhbase.use.dynamic.jar ,但只是在类路径上放置过滤器就可以了。

如果有人愿意写一个关于如何实现和使用自定义过滤器的答案,我将很乐意授予赏金。

首先,让我们更多地了解自定义过滤器来回答这句话:

PS我知道我可以用RegexStringComparator达到我想要的效果,但这看起来非常低效。

自定义过滤器可以在HBase的扫描操作中使用。 当您的应用程序执行此类扫描操作(例如,处于spark状态)时,执行程序使用RPC连接来连接到基础区域服务器,而区域服务器使用相同类型的连接从数据节点获取数据。 但问题是应用自定义过滤器的位置? 在你的申请? 当然不。 自定义过滤器应用于区域服务器上的行,只有匹配的过滤器才能应用于您的应用程序。 此外,这意味着使用这些类型的过滤器将有助于解决性能问题。

其次,如果需要根据其值选择某些行,则可以使用不同类型的过滤器,但SingleColumnValueFilter在处理值时可能更有用。 此处提供了完整的自定义过滤器列表。 另外,RegexStringComparator可以用作SingleColumnValueFilter比较器,这是一个例子:

RegexStringComparator regexStringComparator=
                new RegexStringComparator(regexPattern);
SingleColumnValueFilter singleColumnValueFilter=
                new SingleColumnValueFilter(family, qualifier, 
                               CompareOp.EQUAL, regexStringComparator);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM