2013-03-02 75 views
0

由於數據增加,我正在從mysql遷移到hbase。hbase rowkey設計

我正在設計用於高效訪問模式的rowkey。

我想實現3個目標。

  1. 獲取電子郵件地址的所有結果
  2. 獲取電子郵件地址的所有結果+ ITEM_TYPE
  3. 獲取特定電子郵件地址的所有結果+ ITEM_ID

我有4個屬性從

選擇
  1. 用戶電子郵件
  2. 反向時間戳
  3. ITEM_TYPE
  4. ITEM_ID

我應該我rowkey模樣高效地獲取行?

感謝

+0

您能否提供等效的SQL來實現您的目標? – ericson 2013-03-03 06:35:16

+0

select * from table where email =「xyz」and item_type = 2 order by ts desc ...我在(email,item_type,item_id)上有唯一的鍵索引 – 2013-03-03 06:51:56

+0

在'where'語句中'email'和'item_type'是強制的?你有類似'select * from table where email =「xyz」'或'select * from table where item_type = 2'嗎?你已經提到你想在你的文章中「獲取特定item_id的所有結果」。我沒有看到你的SQL。 – ericson 2013-03-03 07:00:36

回答

0

也許你是在正確的方向儘可能級聯排按鍵已經領導:在任何情況下,以下內容出自您的文章介意:

分區鍵可能包括你的反向時間戳加的最經常被查詢的自然鑰匙 - 這是電子郵件嗎?讓我們假設如此:然後根據兩者中的哪一個(反向時間戳vs電子郵件)提供數據的最平衡/非偏斜分佈來選擇前綴。這使您的區域服務器更快樂。

根據更好的平衡分配記錄進行選擇: 反向時間戳加上最常查詢的自然鍵 reversetimestamp-email 或email-reversetimestamp

以這種方式,您將避免在您的區域服務器上出現熱點。 。

爲了獲得額外(次要)索引的良好性能,這還沒有「融入」hbase:他們有一個設計文檔(查看維基中的SecondaryIndexing)。

但是你可以建立自己的幾個方法:

一)使用協處理器寫的ITEM_TYPE爲rowkey到tabole是原始(USER_EMAIL反向時間戳(反之亦然)的列分開的事實b)如果磁盤空間沒有問題和/或行很小,只需繼續並在第二個(和item-id情況下的第三個)表中複製整個行。

1

假設你的主要通道是通過電子郵件,你可以有你的主表鍵 電子郵件+反向時間+ ITEM_ID(假設ITEM_ID讓你的獨特性)

你可以有一個額外的「指標」表電子郵件+ ITEM_TYPE +反向時間+ item_id和電子郵件+ item_id作爲映射到第一個表的關鍵字(因此通過這些檢索是兩步過程)

+0

好吧,我可以保留item_type作爲列限定符..所有列限定符索引hbase? – 2013-03-04 17:12:58

+0

您可以將所有數據添加爲列,但HBase並不真正對任何內容進行索引。它的功能是通過按鍵以字典形式存儲數據,以便輕鬆找到它,但它不是數據庫意義上的索引。 – 2013-03-04 17:39:28