我发现HBase表的建模有以下要求。
我有一个表'Store',用于存储商店详细信息(必胜客)。
我有一张表'Order',其中包含交易摘要(总交易金额等)。
我有另一个表'Order_Item',其中存储了交易中的每个订购商品(这包含商品ID,商品名称,商品数量,税金等)。
示例:日期范围 - 上周,商店 - 比萨A,项目 - A,总收入 - 120美元
示例:日期范围 - 上周,商店 - 比萨A,项目 - A,%收入百分比 - 23%
我真的被困在如何建模hbase表格上,截止日期让我紧张。
请有人帮助我。
答案 0 :(得分:4)
在HBase中,您希望确保围绕典型查询设计表格。如果你根据一些任意“有意义”来设计你的表,你会看到糟糕的表现。
由于主要要求是按日期范围/商店/项目查询,您希望这是您的密钥。如果这是您的密钥,那么您的查询将会很快。
我建议您将密钥与日期范围+商店+项目以及某些分隔符连接起来,例如:
20110103-PIZZAHUT-MEATLOVERS
20110103-PIZZAHUT-VEGETABLE
20110104-PIZZAHUT-MEATLOVERS
20110105-DOMINOS-HAWAIIAN
然后,将销售到第一列系列中的每个项目存储为(ID:profit)。此处的ID类似于唯一的时间戳,UUID,收据ID或其他内容。
对于第一个查询,您所做的就是在DATE-STORE-ITEM上执行键查找,然后对您检索的所有值求和。
对于第二个查询,请执行从20110107-PIZZAHUT-!
到20110206-PIZZAHUT-~
的范围扫描。总结您要查找的项目以及您不想要的所有项目。最后,计算百分比。
答案 1 :(得分: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 ... :)