2012-09-14 33 views
0

我需要在Hbase中設計一個索引表。例如,我的主表是這樣的:如何設計hbase索引表?

Person 
row key: uuid --> name and address columns 

我需要創建一個索引Person_Name_Index表,地圖名稱與人的關鍵。我的索引表的樣子:

Person_Name_Index 
row key: name --> person row key 

什麼是插入多個人行鍵在Person_Name_Index行密鑰名稱的有效途徑?我可以將所有人行鍵設爲單個值,但是如果我需要將另一個人行鍵添加到名稱。我必須閱讀所有這些,然後添加一個新的項目。如果我將每個人行鍵都放在單獨的列中,我需要確保名稱是唯一的。我不知道如何做到這一點,而不使用uuid類型的字符串,這使得我的表格也很大。任何想法或建議?

感謝,

+0

的所有人您可能是在做錯事,我不明白Person_Name_Index表的目標。你爲什麼想要用人行鍵映射名字?在Hbase中,你應該對數據進行非規範化處理。如果您沒有對數據進行非規範化處理,則基本上最終會得到與RDBMS相同的實現。我不知道你的用例,但它可能有一個解決方案,所有這些數據將在同一個表中 –

+0

我想找到給定名稱的所有用戶。我可以掃描我的人員表,但是通過索引表掃描會更高效,不是嗎? –

+0

你的人桌用例是什麼?您應該將名稱作爲人員表的行鍵,並將所有地址放在單個列家族中 –

回答

0

肖恩在HBase的說,建議根據他們的數據模型訪問你需要的路徑。不建議將其視爲RDBMS(因爲它不是)。在你情況下,你可以阿克人表作爲名稱,後跟一個分隔(如管)的鍵,然後按UID - 那麼你可以按名稱搜索,並有每人一個唯一的ID

String personName="Name to Search"; 
String delimiter="|"; 
PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes(personName+delimiter)); 
Scan scan = new Scan(); 
scan.setFilter(prefixFilter); 
ResultScanner resultScanner = hBaseTable.getScanner(scan); 

而且然後在掃描器上迭代以查看名稱爲

+0

我使用uuid作爲索引表的列族,而不是將它們組合起來。索引表中的一行將如下所示:name - > muliple(uuid,person)。你認爲這種方法有什麼問題嗎? –

+0

問題是,您必須撥打兩個電話來獲取數據,而不是一個電話。 HBase按照鍵的字典順序對數據進行排序,並且可以使用PrefixFilter進行掃描(我將編輯回覆以添加示例) –

+0

「name」+「|」+ uuid的值是什麼?這是一個人還是一個空的價值。 –