给定以下 HBase 架构场景(来自官方常见问题解答)...

您如何设计一个HBASE表,例如两个实体之间的多对多关联,例如学生和课程?

我会定义两个表:

学生:学生ID学生数据(名称,地址,...)课程(在此处使用课程ID作为列预选赛)

课程:课程ID课程数据(名称,教学大纲,...)学生(在此处使用学生ID作为列预选赛)

此模式可让您快速访问查询,向学生展示所有课程(学生桌,课程家庭)或所有课程的学生(课程表,学生家庭)。

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

有帮助吗?

解决方案

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

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

其他提示

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

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

使用文件管理器来实现此目的。

SingleValueFiler filer = new SingleValueFiler( 以及基于 api 的参数);

将其添加到 Scan ( org.apache.hadoop.hbase.client.Scan scan = new Scan();scan.setFiler(过滤器);

看起来 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 时,您确实必须知道如何使用数据,以便可以提前开发适当的索引以获得快速答案。随机临时查询似乎并不总是适用于此模型。

不管怎样,我对此也是新手,所以看到这样的问题和可能的解决方案会有所帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top