如何在HBase中的行中的所有列中查找值

时间:2014-01-16 20:19:07

标签: java filter hbase

我在HBase中有一个表来存储用户对象。每个对象有4列,我将每列命名为[object_creation_date]_[column_name],以按对象创建日期自动排序列。

For example:
RowKey  20140101_a 20140101_b 20140101_c 20140101_d 20140102_a 20140102_b 20140102_c 20140102_d
1        1a          1b         1c          1d         2a          2b        2c        2d

现在我正在尝试按列过滤这些值。有没有办法找到属性"C"等于"2c"的对象(4列一组)?它应该返回20140102

我尝试使用ColumnRangeFilter类,但它似乎只使用前缀,我需要一个RegExp来查找所有"C"列,无论它们创建的日期如何。

是否有其他方法可以做到这一点,或者我可以使用不同的数据表示?

2 个答案:

答案 0 :(得分:1)

您可以随时实施自己的过滤器,但为什么不将列的顺序反转为[column_name]_[object_creation_date]?这样你就可以使用标准的ColumnPrefixFilter,这似乎更合适。


无论如何,我认为你应该考虑从广泛到高大的方法:

RowKey      u   a   b   c   d
1_20140101  1   1a  1b  1c  1d
1_20140102  1   2a  2b  2c  2d
1_20140103  1   3a  3b  3c  3d

这将允许您对已知用户执行非常快速的扫描,甚至可以对已知列执行全表扫描。

或者,如果您想避免为同一个用户设置多行,则可以使用versioning


提示:为了获得更好的查询性能,您甚至可以使用此类行键构建自己的“二级索引”表:[column]_[4char_md5_of_value]_[user_id]

RowKey    value   u  d 
a_afaa_1  1a      1  20140101 
a_a32a_1  2a      1  20140102
a_45ae_1  3a      1  20140103
b_l413_1  1b      1  20140101 
b_533a_1  2b      1  20140102
b_8ce3_1  3b      1  20140103
c_b31c_1  1c      1  20140101 
c_2ca1_1  2c      1  20140102
c_a99f_1  3c      1  20140103

这样可以超快地查找任何列值:对于要搜索的值,执行md5,并获取十六进制字符串的前4个字符,并进行扫描,提供行前缀{{1}并添加ColumnValue过滤器(因为在同一个哈希下可能有多个值)。

您也可以将此表限制为您要查询的列,以避免保存您不需要的数据。

答案 1 :(得分:0)

由于限定符的结构固定为date + seperator的9个字节,因此通过修改ColumnPrefixFilter

的代码来创建自己的过滤器相对容易

比较限定符名称字节的每一行只需将偏移量加上9,如

int cmp = Bytes.compareTo(buffer, qualifierOffset + 9 , qualifierLength, this.prefix, 0, qualifierLength);