2014-01-26 57 views
1

hbase表將CityNameID作爲組合鍵。我提出rowkeys如下:爲hbase中散列的部分密鑰製作停止鍵

  • Cityname MD5散列和ID分別
  • 追加散列IDCityname

Row key : MD5[CityName]MD5[ID]

現在,我想獲得與CityName = "London"所有行。

我試圖做部分掃描,但我不知道如何使停止鍵。或者還有其他方式可以獲得具有特定城市的所有行。

回答

1

這裏有一個簡單的解決方案,可能會工作你:

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

請注意stopRow是排他性的,因此,爲Integer.MAX_VALUE的ID的行將被排除在外。

如果你的ID是8字節長的0L和Integer.MAX_VALUE的爲Long.MAX_VALUE取代0 :)


反正我通常在含我行鍵使用1個字節作爲分隔符(空)哈希值時,它的明顯,我打算使用它們進行掃描,有點像:

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

鍵以字典順序存儲在HBase中。因此,如果「倫敦」的MD5哈希爲'1234',那麼您可以獲得以倫敦開頭的所有密鑰,但是從'1234'到'1235'掃描 - 即開始密鑰只是您的MD5哈希值,結束鍵只是將密鑰第一部分的最後一個字節增加1