草庐IT

hadoop - Hbase排序效率

coder 2024-01-09 原文

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

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

最佳答案

如果您必须进行全表扫描(您确实这样做了),那将不是一个很好的解决方案。事实上,如果您有非常多的行,这将是一个糟糕的解决方案。

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

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


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

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

索引表1

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

要通过 V(E) 查找实体 E,只需转到该行查找 K(E)

If your attribute values V(E) are unique, use this approach.

Think a table of Employee entities, where each employee has a unique EmployeeID within the company, K(E). The main Employee table could use the unique EmployeeID as the row key, and the Employee_SSN_Index could use the employee SSN number V(E) (which is also unique). This provide a fast lookup of employees by their SSN numbers.

索引表 2

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

要使用 V(E) 查找所有实体 E,只需对以 V(E)<>.

There is a variant for the case when the length of V(E) is not fixed with and it may be impossible to distinguish the point at which V(E) ends and K(E) begins. A separator may be placed between V(E) and K(E) in the row key. For example V(E) ++ "|" ++ K(E). In this case, the prefix to scan is V(E) ++ "|".

A Employee_Department_Index table could use the DepartmentID an employee works in as the attribute value V(E).

索引表 3

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

要查找所有实体 EV(E),获取行 V(E) 请求列中的所有列家庭 F

This approach should really be kept to the case where the number of entities in each row of the index is small.

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

有关hadoop - Hbase排序效率的更多相关文章

  1. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  2. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  3. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  4. ruby-on-rails - Ruby .each 效率 - 2

    我这样做(在我看来):#myUserisaUserinActiveRecordwith:has_many:postsmyUser.posts.eachdo|post|end如果用户有10个帖子,这会调用10次数据库吗?这些循环应该像(不那么漂亮)吗?:myPosts=myUser.postsmyPosts.eachdo|post|endHere是我测试的ruby​​文件的粘贴箱。编辑修改了粘贴箱。这让我想起了Java中的代码for(inti=0;i应该是(除非数组被修改)for(inti=0,len=someExpensiveFunction();i我错过了什么吗?我看到一堆Rails

  5. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  6. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  7. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  8. ruby catch 和效率 - 2

    catch在Ruby中是为了跳出深度嵌套的代码。在Java中,例如Java用于处理异常的try-catch可以实现同样的效果,但它被认为是糟糕的解决方案,而且效率也很低。在用于处理异常的Ruby中,我们有begin-raise-rescue,我认为将它用于其他任务也很昂贵。Ruby的catch-throw真的是比begin-raise-rescue更有效的解决方案吗?或者还有其他原因可以使用它来打破嵌套block而不是begin-raise-rescue? 最佳答案 除了是摆脱控制结构的“正确”方式之外,catch-throw也明显

  9. ruby-on-rails - 如何对对象数组进行排序? - 2

    我有一个对象如下:[{:id=>2,:fname=>"Ron",:lname=>"XXXXX",:photo=>"XXX"},{:id=>3,:fname=>"Dain",:lname=>"XXXX",:photo=>"XXXXXXX"},{:id=>1,:fname=>"Bob",:lname=>"XXXXXX",:photo=>"XXXX"}]我想按fname排序,不区分大小写,所以它会导致编号:1,3,2我该如何排序?我正在尝试:@people.sort!{|x,y|y[:fname]x[:fname]}但这没有任何效果。 最佳答案

  10. ruby - 使用自定义排序首选项对数组进行排序? - 2

    有人可以告诉我如何根据自定义字符串对嵌套数组进行排序吗?比如有没有办法排序:[['Red','Blue'],['Green','Orange'],['Purple','Yellow']]“橙色”、“黄色”,然后是“蓝色”?最终结果如下所示:[['Green','Orange'],['Purple','Yellow'],['Red','Blue']]它不是按字母顺序排序的。我很想知道我是否可以定义要排序的值以实现上述目标。 最佳答案 sort_by对于这种排序总是非常方便:a=[['Red','Blue'],['Green','Ora

随机推荐