合适的HBase表模型

合适的HBase表模型,hbase,Hbase,我发现很难为以下需求建模HBase表 我有一张桌子“商店”,里面有商店的详细信息(必胜客) 我有一个表“订单”,其中有交易摘要(总交易金额等) 我有另一个“Order_Item”表,其中存储事务中的每个订购项目(其中包含项目id、项目名称、项目计数、税收等) 要求是,给定一个时间范围,计算来自特定商店的特定订单项目的总收入 示例:日期范围-上周,商店-比萨饼A,项目-A,总收入-120$ 另一个要求是,给定一个时间范围,计算来自商店的特定订单项目占总收入的百分比 示例:日期范围-上周,商店-比萨

我发现很难为以下需求建模HBase表

我有一张桌子“商店”,里面有商店的详细信息(必胜客)

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

我有另一个“Order_Item”表,其中存储事务中的每个订购项目(其中包含项目id、项目名称、项目计数、税收等)

  • 要求是,给定一个时间范围,计算来自特定商店的特定订单项目的总收入
  • 示例:日期范围-上周,商店-比萨饼A,项目-A,总收入-120$

  • 另一个要求是,给定一个时间范围,计算来自商店的特定订单项目占总收入的百分比
  • 示例:日期范围-上周,商店-比萨饼A,项目-A,收入百分比-23%

    我真的被困在如何为hbase表建模上,最后期限让我感到紧张


    在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-~
    。将您要查找的项目和您不需要的所有项目相加。最后,计算百分比。

    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…)

    非常感谢。这对我帮助很大。但我有个问题。在第一个查询中,如果日期范围是20110103-20110105,我是否必须在日期范围内每天进行键查找??这不是很慢,我必须扫描说5年的日期范围。你是对的;我只是觉得它们比较小。在这样一个大的日期范围的情况下,使用MapReduce作业可能比使用相同结构的数据要好。建议的键有很多有效字节,这些字节对于很多记录都是相同的(“20110103-PIZZAHUT”)请参阅rowkey设计指南I中的第6.3.1节,将row key重新构造为20110103---因此现在row key将类似于20110103-1-23-333。例如,当我使用scan进行范围查询时,startRow-20110103-1-23-endRow-20110105-1-23-我得到的行也不在上述范围内。例如,我也得到了行20110105-1-15-6666。请有人帮我解决这个问题。上面的问题可以通过使用正则表达式过滤器和startRow-20110103和endRow-20110105一起解决吗?回答得好!你的报告很重要,谢谢伊恩·瓦利。您能否解释一下,在给定日期范围的情况下,如何查询特定商店和商品的行。我知道扫描需要开始行和结束行,但如果我给出了部分内容,这将起作用。示例开始行-20110103-PIZZAHUT-vegeture开始行-20110105-PIZZAHUT-vegeture将返回日期2011-01-03和2011-01-05之间的行。请解释我??您是否获得任意时间范围进行查询,或者您是否需要显示固定范围(过去7天、过去30天、去年等)?是的,我有任意时间范围。它就像从选定的特定日期获取最后一周、最后一个月、最后一个季度。