假设我有三行具有以下值:
+------+----------+ | row | f1:c1 | +------+----------+ | row1 | \x00\x00 | | row2 | \x01\x00 | | row3 | \x03\x01 | +------+----------+
是否可以选择带有 \x00
作为值的第二个字节的行(例如 row1
和 row2
)?
进一步说明
我有一个不可变对象(immutable对象),它由几个 UUID
组成,作为我实体的一部分。由于 UUID
具有固定长度,因此最有效的存储方式是将所有部分连接到单个字节数组中并将其存储在单个列中。
但是,我必须能够根据所述对象的特定字段选择行。 这在理论上非常简单:我需要做的就是获取特定偏移量的列值,并将接下来的 16 个字节与搜索值进行比较。
事实上 ByteArrayComparable
已经有点像那样工作了。它需要一个指向值开始的偏移量,看来我需要的只是在其上添加额外的偏移量。但我不知道该怎么做。
总而言之,这在我看来是一个广泛适用的用例。所以必须有办法做到这一点,除非我遗漏了什么。
P.S. 我知道我可能可以使用 RegexStringComparator
实现我想要的,但这似乎非常低效。
更新
HBase 支持自定义过滤器,这非常适合我的情况。不幸的是,我能找到的所有文档似乎都已过时,因为 hbase.dynamic.jars.dir
和 hbase.use.dynamic.jar
不存在于我的配置中(我的版本是 2.0. 1).
更新 2
我设法用自定义过滤器解决了这个问题。看起来他们删除了 hbase.dynamic.jars.dir
和 hbase.use.dynamic.jar
,但只需将过滤器放在类路径上就可以了。
如果有人愿意写一个关于如何实现和使用自定义过滤器的答案,我很乐意悬赏。
最佳答案
首先,让我们进一步了解自定义过滤器来回答这句话:
P.S. I know that I can probably achieve what I want with RegexStringComparator but this seems wildly inefficient.
可以在 HBase 的扫描操作中使用自定义过滤器。当这样的扫描操作从您的应用程序执行时,例如在 spark 上,执行程序使用 RPC 连接连接到底层区域服务器,区域服务器使用相同类型的连接从数据节点获取数据。但问题是自定义过滤器应用在哪里?在你的申请上?当然不。自定义过滤器应用于区域服务器的行,只有匹配的过滤器才会出现在您的应用程序中。此外,这意味着使用这些类型的过滤器将有助于解决性能问题。
其次,如果需要根据值选择某些行,您可以使用不同类型的过滤器,但 SingleColumnValueFilter 在处理值时可能更有用。提供了自定义过滤器的完整列表 here .此外,RegexStringComparator 可以用作 SingleColumnValueFilter 比较器,下面是一个示例:
RegexStringComparator regexStringComparator=
new RegexStringComparator(regexPattern);
SingleColumnValueFilter singleColumnValueFilter=
new SingleColumnValueFilter(family, qualifier,
CompareOp.EQUAL, regexStringComparator);
关于java - HBase - 带偏移量的值过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52317032/