8

鉴于以下 HBase 模式场景(来自官方常见问题解答)......

您将如何为两个实体(例如学生和课程)之间的多对多关联设计 Hbase 表?

我会定义两个表:

学生:学生 ID 学生数据(姓名、地址、...)课程(此处使用课程 ID 作为列限定符)

课程:课程 ID 课程数据(姓名、教学大纲、...)学生(此处使用学生 ID 作为列限定符)

此架构使您可以快速访问查询,显示学生的所有班级(学生表、课程家庭)或班级的所有学生(课程表、学生家庭)。

您将如何满足要求:“给我所有共享至少两门共同课程的学生”?您能否在 HBase 中构建一个“查询”来返回该集合,或者您是否必须检索所有相关数据并自己在代码中处理?

4

4 回答 4

3

所描述的查询更适合关系数据库。但是,您可以通过预先计算结果来快速回答查询。例如,您可能有一个表,其中键是共同班级的数量,而单元格是具有共同键的多个班级的个别学生。

您可以对此使用变体来回答诸如“哪些学生在 X 班和 Y 班”之类的问题:将班级用作键的一部分(按字母顺序排列,或者至少是一致的),同样,每一列都是学生。

于 2009-10-01T20:08:08.833 回答
2

这种类型的查询不能通过 0.20.0 API 获得。我不确定是否有任何计划(我怀疑它会很快出现)。您会在 HBase 网站上找到一些可能回答该问题的路线图详细信息。

您需要在自己的应用程序中计算答案(尽管我很想被证明是错误的)。

于 2009-09-22T01:01:52.763 回答
1

使用文件管理器来实现这一点。

SingleValueFiler filer = new SingleValueFiler( and your arguments based on the api );

将此添加到 Scan ( org.apache.hadoop.hbase.client.Scan scan = new Scan(); scan.setFiler(filter);

于 2010-05-05T14:20:32.070 回答
1

似乎 MapReduce 可能是解决这个问题的一种方法;不幸的是,如果它是即时完成的,它不会立即给出结果。只要仔细考虑一下,您就可以在地图阶段计算一对学生最终在同一个班级的次数。在减少阶段,您可以将这些对相加并写出(发出)总和为 2 或更多的对。这种方法可用于预先生成一个索引(如前所述),该索引指示具有“x”课程共同的学生对。这种索引的关键可能是类似于“X/Student1_Key/Student2_Key”的内容,其中 X 是他们共同拥有的课程数量。对索引进行范围扫描(例如,X>=2)会给你答案。鉴于 HBase 与 MapReduce 的原生集成,沿着这些思路的解决方案应该很简单。

此外,按照 BigTable 模型,您甚至不需要创建两个表。只需在每个记录键之前加上“种类”,例如课程:或学生:。由于这些行是按字典顺序排列的,因此它们很容易按种类进行扫描。填充(或生成)支持每种属性所需的列。由于 HBase 支持高度稀疏的表,因此效果很好。请参阅有关使用 BigTable 选择键和开发索引的精彩演示:http ://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html 。这个演示真的帮助我了解了如何将东西存储在 HBase 等数据库中以进行高效检索。

但回到最初的问题,似乎在使用 HBase 时,您确实必须知道如何使用您的数据,以便可以事先开发适当的索引以获得快速答案。随机临时查询似乎并不总是适用于该模型。

无论如何,我也是新手,所以看到这些问题和可能的解决方案会有所帮助!

于 2010-10-22T00:28:41.207 回答