给出以下HBase架构方案(from the official FAQ)...
您将如何设计Hbase表 用于多对多之间的关联 两个实体,例如学生和 当然?
我会定义两个表:
学生:学生ID学生数据 (姓名,地址,......)课程(使用 课程ID作为列限定符)
课程:课程ID课程数据(姓名, 教学大纲,...)学生(使用学生 ids作为列限定符)
此架构可让您快速访问 查询,显示所有类 学生(学生表,课程 家庭),或所有班级的学生 (课程表,学生家庭)。
您如何满足要求:“给我所有共享至少两门共同课程的学生”?您可以在HBase中构建一个返回该集合的“查询”,还是必须检索所有相关数据并在代码中自行处理它?</ p>
答案 0 :(得分:3)
所描述的查询更适合于关系数据库。但是,您可以通过预先计算结果来快速回答查询。例如,您可能有一个表,其中键是共同的类的数量,并且单元格是具有共同键的许多类的单个学生。
你可以使用一个变体来回答诸如“哪个学生在X班和Y班”中这样的问题:将这些课作为关键词的一部分(按字母顺序排列,或者至少是一致的),再次,每一个专栏是学生。
答案 1 :(得分:2)
这种类型的查询不能通过0.20.0 API获得。我不确定是否有任何计划(我怀疑它会很快出现)。您可以在HBase网站上找到可能回答该问题的路线图详细信息。
你需要在自己的应用程序中计算答案(虽然我很想被证明是错误的)。
答案 2 :(得分:1)
使用文件管理器来实现此目的。
SingleValueFiler filer = new SingleValueFiler(以及基于api的参数);
将此添加到Scan(org.apache.hadoop.hbase.client.Scan scan = new Scan(); scan.setFiler(过滤器);
答案 3 :(得分:1)
似乎MapReduce可能是解决这个问题的一种方法;不幸的是,如果它是在飞行中完成的话,它不会给出即时结果。 只要仔细考虑一下,你就可以在地图阶段计算一对学生在同一班级中的最终次数。在缩减阶段,您可以对这些对求和,并写出(发出)总和为2或更多的对。这种方法可用于预先生成一个索引(如前所述),该索引指示具有共同“x”课程的学生对。这种索引的关键可能是“X / Student1_Key / Student2_Key”,其中X是他们共同的课程数量。索引上的范围扫描(例如,X> = 2)将为您提供答案。鉴于HBase与MapReduce的原生集成,这些方面的解决方案应该是直截了当的。
此外,遵循BigTable模型,您甚至不需要创建两个表。只需在每个记录键之前加上一个“kind”,例如Course:或Student:。由于行按字典顺序排列,因此可以按种类轻松扫描。填充(或生成)支持每种属性所需的列。由于HBase支持高度稀疏的表,因此效果很好。有关使用BigTable选择键和开发索引的详细介绍:http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html。这个演示文稿确实帮助我理解了如何在HBase等数据库中存储东西以便有效检索。
但回到原来的问题,似乎在使用HBase时你真的必须知道你的数据是如何被使用的,所以可以事先开发适当的索引以获得快速答案。随机特殊查询似乎不会总是与此模型一起使用。
无论如何,我也是新手,所以看到这些问题和可能的解决方案有帮助!