2012-04-19 25 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