2014-01-23 39 views
3

我們使用HBase存儲從oracle到hdfs的sqooped的數據。這裏我們將行鍵設計爲字節數組值。行密鑰使用複合關鍵幀如(Md5(schema name).getBytes() + Md5(date (format = yyyy-mm-dd)).getBytes() + ByteBuffer.allocate(8).putLong(pkid).array())。這裏的PKID是一個很長的值。HBase:如果使用行鍵範圍獲取行(如果行鍵存儲爲字節數組值)

如果我想獲取特定模式和特定日期的所有行,我可以使用startrow和endrow或任何其他方式查詢hbase表,以便像這樣查詢?

當我存儲我行鍵字符串如user1_20130123...user1_20130127 我能夠過濾使用

scan 'TempTable', { 
    COLUMNS => ['CF:NAME'], 
    LIMIT => 10, 
    STARTROW => 'user1_20100101', 
    ENDROW => 'user1_20100115' 
} 

在這裏我得到了用戶1行,在這些日期表。當我像上面那樣存儲行鍵時,我該如何查詢?

回答

3

如果您將散列日期設置爲掃描的開始/停止行,將無法將其用作開始/停止行,所以您的行密鑰有問題。

你rowkeys應該是這樣的:

[16B_schema_MD5_hash][8B_long_timestamp][8B_pkid] 

,您可以查詢這樣的:

Scan myScan = new Scan( 
    Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(startTimestamp)), 
    Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(stopTimestamp)) 
); 
+0

好,我知道了,所以如果我存儲行鍵[16B_schema_MD5_hash] [年月日] [8B_pkid],那麼我將能夠查詢,我測試相同的行鍵爲「user1_20130101」。糾正我,如果我錯了。 – GHK

+0

當然,你可以這樣做,因爲特定格式的日期排序正確。只要記住,你將得到相同的32字節鍵(yyyymmdd是一個8字節的字符串),精度很低(幾天而不是毫秒)。 –

+0

當我們將行鍵與散列值和字符串組合使用時,long(轉換後的字符串數組,字符串轉換後的long數組)長度值是否會存在性能問題。從HBase表中查詢記錄的手段將會是這個行密鑰設計的性能問題嗎? – GHK

相關問題