在hbase中为哈希部分键设置停止键

时间:2014-01-26 14:35:07

标签: hbase

hbase表格有CityNameID作为复合键。我按如下方式制作了rowkeys

  • 分别为CitynameID的MD5哈希
  • 将散列ID附加到Cityname

Row key : MD5[CityName]MD5[ID]

现在,我希望获得CityName = "London"的所有行。

我尝试进行部分扫描,但我不明白如何制作停止键。或者是否有其他方法可以获取特定城市的所有行。

2 个答案:

答案 0 :(得分:1)

这是一个可能对您有用的简单解决方案:

Scan myScan = new Scan(Bytes.add("yourHashedCityName".getBytes() + Bytes.toBytes(0), Bytes.add("yourHashedCityName".getBytes() + Bytes.toBytes(Integer.MAX_VALUE));

请注意,stopRow是独占的,因此,将排除ID为Integer.MAX_VALUE的行。

如果您的ID为8字节长,则将0替换为0L,将Integer.MAX_VALUE替换为Long.MAX_VALUE:)


无论如何,我通常在包含哈希的行键中使用1个字节作为分隔符(null),因为很明显我将使用它们进行扫描,有点像:

byte[] myRowkey = Bytes.add("first".getBytes() + "\0".getBytes() + "second".getBytes());

这样,我可以很容易地做到:

Scan myScan = new Scan(Bytes.add("first".getBytes() + "\0".getBytes()), "first".getBytes() + "\1".getBytes());

扫描程序将从first\0开始直到first\1(由于我只使用\ 0作为分隔符而不会存在的行。)

答案 1 :(得分:1)

键以词法顺序存储在HBase中。因此,如果“伦敦”的MD5哈希是'1234',那么你可以获得所有以伦敦开头的键,但是从'1234'扫描到'1235' - 即开始键只是你的MD5哈希和结束key只是将键的第一部分的最后一个字节递增1