嵌套hbase实体中的高效搜索

1szpjjfi  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(351)

如果我遵循ian varley的hbase设计实践,在同一个hbase实体中存储一组嵌套实体(以受益于hbase的单行acid属性),是否可以有效地搜索甚至mapreduce这些嵌套实体,以使用特定的标准来决定是否选择封装(父)实体?
例如,我有一个客户实体,其中嵌套了订单实体

customerinfo和orders是列族。对于orders列族(这里很有趣),1、2…6是列名(在hbase中是动态的,可以动态添加),旁边的文本是order实体详细信息(我将这些详细信息序列化为文本,但是序列化并不重要,因为hbase不关心)
如果我有很多像这个客户实体这样的实体(更多细节见下表3)
是否可以基于mapreduce(仅map?)方法或任何其他高效方法选择客户实体,扫描客户实体,读取这些客户实体内的客户订单值,并仅返回包含特定条件(例如成本>40)的订单的客户实体?
类似地,是否可以返回符合指定条件(成本>40)的订单实体以及客户实体,以显示客户及其最昂贵的订单?
如果每个客户的订单数量非常大(高达100000个),并且客户数量也很大(高达100000个),那么这个选择操作是否可以相当快地完成(不到一秒钟)?假设我可以为此构建一个非常大的hbase集群(根据需要)。
既然我认为3)是不可能的(因为一个mapreduce工人必须处理100000个序列化的订单),那么对于这个问题(根据他们的订单属性快速选择客户)有什么更好的设计呢?将客户实体反规范化为包含客户信息的订单实体是更好的方法吗?

fnatzsnv

fnatzsnv1#

是否可以基于mapreduce(仅map?)方法或任何其他高效方法选择客户实体,扫描客户实体,读取这些客户实体内的客户订单值,并仅返回包含特定条件(例如成本>40)的订单的客户实体?
类似地,是否可以返回符合指定条件(成本>40)的订单实体以及客户实体,以显示客户及其最昂贵的订单?
基于mapreduce方法选择实体确实是可能的,因为map可以处理rowkey中的所有数据,然后您可以解析数据、过滤您需要的内容,并只写入您需要的数据。
如果每个客户的订单数量非常大(高达100000个),并且客户数量也很大(高达100000个),那么这个选择操作是否可以相当快地完成(不到一秒钟)?假设我可以为此构建一个非常大的hbase集群(根据需要)。
我不认为mapreduce是为动态过程设计的,因为它更适合批处理。你可以试着用Spark。
既然我认为3)是不可能的(因为一个mapreduce工人必须处理100000个序列化的订单),那么对于这个问题(根据他们的订单属性快速选择客户)有什么更好的设计呢?将客户实体反规范化为包含客户信息的订单实体是更好的方法吗?
你可以改变设计,利用hbase扫描程序和它的过滤器。而不是 1:"ItemA;Cost:$12" 你可以试试 1-ItemA:"12"ItemA-1:"12" 或者将值存储在整数字节而不是字符串中,这样您就可以根据需要使用带值过滤器的扫描来过滤返回的结果
或者您可以尝试多层体系结构,其中有用于处理的数据表和用于实时访问的聚合表

相关问题