Hbase排序效率

时间:2014-07-25 03:48:18

标签: hadoop hbase

在我的Hbasetable中,我在第100行和第4000行有员工姓名“Simon”,我有另一名同名“Simon”的员工。现在我希望从员工表中获取名为“Simon”的所有员工。行键是每个员工的SSN。

我的问题是,如果我触发查询以获得名为“Simon”的所有员工.Hbase中的搜索效率如何。因为第一个名字“simon”在第100行,第二个“simon”名称在4000.为了获得名称为“simon”的雇员,hbase必须遍历所有表格以找出这个名称。我们将如何高效搜索在这种情况下正在进行全表扫描?

1 个答案:

答案 0 :(得分:0)

如果你必须进行全表扫描 - 你做了 - 这不是一个很好的解决方案。事实上,如果你有很多行,那将是一个糟糕的解决方案。

大多数关系数据库管理系统(或“SQL数据库”)为解决此问题所做的是创建索引。由于您使用的是“NoSQL数据库”,因此它不会自动为您创建索引。

让我们看一下如何手动创建索引,以便有效地适应特定类型的查询。


假设您有一组实体S,其中E中的每个实体S都有一个唯一键K(E)和一个属性值V(E)。进一步假设您的实体位于HBase表中,每行一个,K(E)作为每个实体E的行键。

S相对于V索引是另一个通常以三种形式之一呈现的表格。

索引表1

假设V(E)对每个实体E也是唯一的。然后S相对于V 索引是一个表,每行有一个实体,其中表有行键V(E),列包含{{ 1}}。

要按K(E)查找实体E,只需转到该行即可查找V(E)

  

如果属性值K(E)是唯一的,请使用此方法。

     

考虑一个V(E)个实体的表格,其中每个员工在公司内都有一个唯一的EmployeeEmployeeID。主K(E)表可以使用唯一Employee作为行键,EmployeeID可以使用员工SSN号Employee_SSN_Index(也是唯一的)。这样可以通过SSN编号快速查找员工。

索引表2

假设V(E)对于每个实体V(E)可能不是唯一的;也就是说,可能存在重复。然后E相对于S 索引是每行一个实体的表,其中表的行键为V

要使用V(E) ++ K(E)查找所有实体E,只需对以V(E)开头的行进行前缀扫描。

  

V(E)的长度未固定时,有一种变体,可能无法区分V(E)结束和V(E)开始的点。分隔符可以放在行键中的K(E)V(E)之间。例如K(E)。在这种情况下,要扫描的前缀是V(E) ++ "|" ++ K(E)

     

V(E) ++ "|"表可以使用员工所在的Employee_Department_Index作为属性值DepartmentID

索引表3

假设V(E)对于每个实体V(E)可能不是唯一的;也就是说,可能存在重复。然后E相对于S 索引是一个每行包含一组实体的表,其中表的行键为V和列系列V(E),其中包含限定符F。也就是说,实体按属性值分组为行。

要使用K(E)查找所有实体E,请抓住请求列系列V(E)中所有列的行V(E)

  

这种方法应该保持在索引每行中实体数量很少的情况下。