2014-01-16 32 views
0

我在HBase中有一個表來存儲用戶對象。每個對象有4列,我將每列命名爲[object_creation_date]_[column_name],以按對象創建日期自動排列列。如何在HBase中的所有列中找到一個值

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類,但它似乎只與前綴工作,我倒是需要一個正則表達式查找所有"C"列,不管它們的創建日期。

是否有另一種方法做到這一點,或者我可以使用不同的表示數據?

回答

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個字符,然後執行掃描,提供行前綴[column]_[hash],並添加ColumnValue過濾器(因爲可能存在多個值相同的哈希)。

您也可以將此表限制在要查詢的列中,以避免保存您不需要的數據。

+0

好吧,這正是我期待和你們的做法唯一的問題是,如果我顛倒順序,我不能拿進階自動訂單的抗衡。這對我來說很重要,因爲我在分頁列表中使用它,我不想自己命令顯示最後N個對象(由用戶)。 另一方面,我避免將它們分成幾行,因爲我認爲這種數據庫旨在作爲傳統關係數據庫以「列方式」而不是「行方式」使用。 –

+0

這並非如此,表格並不意味着當然,它們可以有更高的I/O效率,但是處理起來要複雜得多(正如你現在所經歷的那樣),最終,這一切都取決於你的數據訪問模式(更多信息在這裏:http://hbase.apache.org/book.html#schema.smackdown)。無論如何,構建列搜索的二級索引將是迄今爲止最快的方法,足以處理大量實時查詢(僅適用於精確匹配)。 –

0

由於您的限定符的結構被固定到9個字節日期+分隔符這將是比較容易通過修改的ColumnPrefixFilter

每個在那裏比較限定符名稱的字節行中的代碼來創建自己的過濾器只需添加9偏移量爲

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

相關問題