2012-04-19 23 views
4

我在爲以下需求建模HBase表格時遇到困難。合適的HBase表格模型

我有一個表'店'它存儲商店的詳細信息(必勝客)。

我有一個表「訂單」,其中有交易總結(總交易金額等)。

  1. 的要求,賦予了另一個表「Order_Item」,其中的每一個交易項目有序存儲(這樣做的項目編號,項目名稱,項目數,稅收等。)時間範圍計算來自特定商店的特定訂單商品的總收入。

例如:日期範圍 - 上週,商店 - 比薩A,物品 - A,總收入 - $ 120

  1. 另一項要求是,給定一個時間範圍,通過計算總收入的百分比來自商店的特定訂單商品。

例如:日期範圍 - 上週,商店 - 比薩A,物品 - A,%百分比收入 - 23%

我真的停留在如何將HBase的表模型和限期讓我緊張。

請有人幫助我。

+0

你會得到任意的查詢時間範圍還是需要顯示固定範圍(過去7天,過去30天,去年等)? – 2012-04-21 06:34:27

+0

是我有任意的時間範圍。就像上個星期的上個月,從上個月的特定日期開始。 – dharshan 2012-04-21 08:51:10

回答

4

在HBase中,你想確保你圍繞典型的查詢來設計你的表。如果你根據一些任意的「有意義的」設計你的表格,你會看到糟糕的表現。

由於主要要求是按日期範圍/商店/項目進行查詢,因此您希望這是您的關鍵。如果這是你的關鍵,那麼你的查詢將會很快。

我建議你讓你的關鍵日期範圍+實體店+項目與一些分隔符一起的串聯,如:

20110103-PIZZAHUT-MEATLOVERS 
20110103-PIZZAHUT-VEGETABLE 
20110104-PIZZAHUT-MEATLOVERS 
20110105-DOMINOS-HAWAIIAN 

然後,存儲銷售到第一列家庭爲每一個項目(ID:利潤) 。這裏的ID就像一個獨特的時間戳,一個UUID,一個收據ID或其他東西。

對於第一個查詢,您所做的只是在DATE-STORE-ITEM上進行密鑰查找,然後求和您檢索的所有值。

對於第二個查詢,請執行從20110107-PIZZAHUT-!20110206-PIZZAHUT-~的範圍掃描。總結你正在尋找的物品以及你不是的所有物品。最後,計算百分比。

+0

非常感謝。這對我有很大幫助。但我有問題。 在第一個查詢中說日期範圍是從20110103 - 20110105,我必須在日期範圍內每天進行密鑰查找嗎?這不會慢,我不得不掃描說5年的日期範圍。 – dharshan 2012-04-19 14:52:30

+0

你是對的;我只是假定他們更小。在這種日期範圍很大的情況下,對於相同結構的數據,使用MapReduce作業可能會更好。 – 2012-04-19 15:04:48

+0

建議的密鑰有很多重要字節,這些字節對於大量記錄(「20110103-PIZZAHUT」)是相同的,請參見rowkey設計準則http://hbase.apache.org/book/rowkey.design中的第6.3.1節。 html – 2012-04-21 06:40:57

4

orangeoctopus建議的方法是每個商店每個商店每天存儲一行,併爲每個交易存儲一列。這是一個很好的例子;另一種方法是將每個事務存儲在自己的行中,並使用相同的密鑰字段以及作爲密鑰一部分的唯一ID。然後在單列家族中有一個列,數量。

20110103-PIZZAHUT-MEATLOVERS-857283394 
20110103-PIZZAHUT-MEATLOVERS-857283395 
20110103-PIZZAHUT-MEATLOVERS-857283396 
20110103-PIZZAHUT-VEGETABLE-859238494 
20110103-PIZZAHUT-VEGETABLE-859238494 

同樣的邏輯適用於這種設計;您的查詢既掃描特定的日期範圍,也以這種方式獲取他們需要的數據(並且,如果您想限制爲單個商店或商店產品組合,則可以這樣做)。唯一的區別是,現在您正在掃描一堆行,而不是每個日期/商店/項目組合中的一行中的許多列。

這些是HBase中的兩個關鍵設計技術:實體作爲行,或實體作爲嵌套在父實體行中的列。後者的優點是一行中的所有列都可以事務更新;缺點是要檢索它的代碼稍微複雜一些(並且,如果併發性很高,則爲該事務支付一定的代價)。

僅供參考,你不能高效地處理這個行鍵是一個查詢,不按照您的行鍵的部分,按順序。舉例來說,如果您想要始終銷售比薩餅屋,那麼您必須掃描服務器端表格中的每一行(這可能不是所希望的b/c,假設您在此表中有大量數據,否則你不會使用HBase ... :)

+0

很好的答案!你的FYI非常重要。 – 2012-04-19 15:07:42

+0

謝謝伊恩瓦利。您能否向我解釋如何查詢指定日期範圍內特定商店和商品的行數。 我知道SCAN需要開始和結束行,但是如果我給予部分行爲,它將起作用。 例如 開始行 - 20110103,PIZZAHUT蔬菜 開始行 - 20110105,PIZZAHUT蔬菜 這是否會返回日期2011-01-03 2011-01-05和 請解釋一下我的行? – dharshan 2012-04-19 15:08:28