10

我必须在 Hbase 中加入表。

我集成了 HIVE 和 HBase,效果很好。我可以使用 HIVE 进行查询。

但是有人可以帮助我如何在不使用 HIVE 的情况下加入 HBase 中的表。我认为使用 mapreduce 我们可以实现这一点,如果可以的话,任何人都可以分享一个我可以参考的工作示例。

请分享您的意见。

我心里有个办法。那是,

如果我需要加入表 A x B x C; 我可以使用 TableMapReduceUtil 来迭代 A,然后在 TableMapper 中从 B 和 C 获取数据。然后使用 TableReducer 写回另一个表 Y。

这种方法会不会很好。

4

1 回答 1

13

这当然是一种方法,但是如果您对每个扫描行进行 2 次随机读取,那么您的速度将会直线下降。如果您要显着过滤行或在 A 中有一个小数据集,这可能不是问题。

排序合并连接

然而,在 HBase 0.96 中可用的最佳方法是 MultipleTableInput 方法。这意味着它将扫描表 A 并使用允许表 B 匹配的唯一键写入其输出。

例如,表 A 发出 (b_id, a_info) 和表 B 将发出 (b_id, b_info) 在 reducer 中合并在一起。

这是一个排序合并连接的例子。

嵌套循环连接

如果您在行键上加入或加入属性按照表 B 排序,则可以在每个任务中都有一个扫描仪实例,该实例从表 B 中顺序读取,直到找到它正在寻找的内容。

例如,表 A 行键 =“companyId”,表 B 行键 =“companyId_employeeId”。然后对于表 A 中的每个公司,您可以使用嵌套循环算法获取所有员工。

伪代码:

for(company in TableA):
    for(employee in TableB):
        if employee.company_id == company.id:
            emit(company.id, employee)

这是一个嵌套循环连接的示例。

更详细的连接算法在这里:

于 2012-08-02T21:03:33.050 回答