在我的Hbasetable中,在第100行的员工名为“Simon”,在第4000行的员工名为“Simon”。现在,我想从Employee表中获取所有名称为“Simon”的员工。行键是每个员工的SSN。

我的问题是,如果我触发查询以获取所有名称为“Simon”的员工。Hbase的搜索效率如何?因为第一个名称“simon”在第100行中,第二个“simon”名称在4000行中。要获得名为“simon”的员工,hbase必须遍历所有表才能找到该名称。搜索效率如何,因为我们在这种情况下正在做全表扫描?

最佳答案

如果您必须进行全表扫描(您需要这样做),那将不是一个很好的解决方案。实际上,如果您有很多行,这将是一个糟糕的解决方案。
大多数关系数据库管理系统(或“SQL数据库”)为解决此问题所做的工作是创建索引。由于您使用的是“NoSQL数据库”,因此它不会自动为您创建索引。
让我们看一下如何手动创建索引,以便有效地容纳特定类型的查询。

假设您有一个实体S的集合,其中E中的每个实体S具有唯一的键K(E)和一个属性值V(E)。进一步假设您的实体位于HBase表中,每行一个,用K(E)作为每个实体E的行键。
相对于SV索引是另一个通常以以下三种形式之一出现的表。
索引表1
假设V(E)对于每个实体E也是唯一的。然后S相对于V索引是一个表,每行一个实体,其中该表具有行键V(E)和一个包含K(E)的列。
要通过E查找实体V(E),只需转到该行以查找K(E)

索引表2
假设V(E)对于每个实体E可能不是唯一的;也就是说,可能有重复项。然后S相对于V索引是一个表,每行一个实体,其中该表的行键为V(E) ++ K(E)
要使用E查找所有实体V(E),只需对以V(E)开头的行进行前缀扫描。

索引表3
假设V(E)对于每个实体E可能不是唯一的;也就是说,可能有重复项。然后S相对于V索引是一个表,每行具有一组实体,其中该表的行键为V(E),列族的F带有限定符K(E)。即,实体通过属性值分组为行。
要使用E查找所有实体V(E),请获取V(E)行,以请求列族F中的所有列。

关于hadoop - Hbase排序效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24947725/

10-12 23:46