4

我在为以下要求建模 HBase 表时发现困难。

我有一个表“商店”,它存储商店详细信息(必胜客)。

我有一个表“订单”,其中包含交易摘要(总交易金额等......)。

我有另一个表“Order_Item”,其中存储了交易中的每个订购项目(这有项目 ID、项目名称、项目计数、税等。)

  1. 要求是,给定时间范围,计算来自特定商店的特定订单项目的总收入。

示例:日期范围 - 上周,商店 - 披萨 A,项目 - A,总收入 - 120 美元

  1. 另一个要求是,给定时间范围,计算来自商店的特定订单商品占总收入的百分比。

示例:日期范围 - 上周,商店 - 披萨 A,项目 - A,百分比收入 - 23%

我真的很纠结如何为 hbase 表建模,最后期限让我很紧张。

请有人可以帮助我。

4

2 回答 2

4

在 HBase 中,您希望确保围绕典型查询设计表。如果您根据一些任意的“有意义”来设计表格,您将看到性能不佳。

由于主要要求是按日期范围/商店/项目查询,因此您希望这是您的关键。如果这是您的关键,那么您的查询将会很快。

我建议您将您的密钥设置为日期范围 + 商店 + 项目以及一些分隔符的串联,例如:

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

然后,将每个出售的商品存储到第一个列族中作为 (ID:profit)。这里的 ID 类似于唯一的时间戳、UUID、收据 ID 或其他东西。

对于第一个查询,您所做的只是在 DATE-STORE-ITEM 上进行键查找,然后对您检索到的所有值求和。

对于第二个查询,从20110107-PIZZAHUT-!to进行范围扫描20110206-PIZZAHUT-~。总结您正在寻找的项目以及您不是的所有项目。最后,计算百分比。

于 2012-04-19T10:52:28.383 回答
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 ... :)

于 2012-04-19T13:52:53.477 回答