我在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"
列,无论它们创建的日期如何。
是否有其他方法可以做到这一点,或者我可以使用不同的数据表示?
答案 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);