Mapreduce 如何在hbase中联接表

Mapreduce 如何在hbase中联接表,mapreduce,hbase,Mapreduce,Hbase,我必须在Hbase中连接表 我集成了HIVE和HBase,效果很好。我可以使用配置单元进行查询 但是有人能帮我在不使用配置单元的情况下如何在HBase中连接表吗。我认为使用mapreduce我们可以做到这一点,如果可以,任何人都可以分享一个我可以参考的工作示例 请分享你的意见 我心里有个办法。就是 如果我需要连接表A x B x C; 我可以使用TableMapReduceUtil迭代A,然后在TableMapper中从B和C获取数据。然后使用TableReducer写回另一个表Y 这是一种很好

我必须在Hbase中连接表

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

但是有人能帮我在不使用配置单元的情况下如何在HBase中连接表吗。我认为使用mapreduce我们可以做到这一点,如果可以,任何人都可以分享一个我可以参考的工作示例

请分享你的意见

我心里有个办法。就是

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


这是一种很好的方法。

这当然是一种方法,但如果您每扫描一行进行2次随机读取,那么您的速度将急剧下降。如果您正在显著地过滤行,或者在中有一个小的数据集,这可能不是问题

排序合并联接 但是,HBase 0.96中提供的最佳方法是MultipleTableInput方法。这意味着它将扫描表A,并使用唯一的键写入其输出,该键将允许表B匹配

例如,表A发射(b_id,A_info)和表b将发射(b_id,b_info)合并到减速器中

这是排序合并联接的一个示例

嵌套循环联接 如果您是按行键连接,或者连接属性是按照表B排序的,那么在每个任务中都可以有一个扫描器实例,该扫描器从表B中顺序读取,直到找到它要查找的内容为止

例如,表A row key=“companyId”和表B row key=“companyId\u employeeId”。然后,对于表A中的每个公司,您可以使用嵌套循环算法获得所有员工

伪代码: 这是嵌套循环联接的一个示例

更详细的连接算法如下:

MultipleTableInput-现在在任何HBase版本中都可以使用吗?它是基于map reduce的吗?或者它可以实现实时响应?@Shengjie,答案中提到的MultipleTableInput包含在0.96中,但是如果您可以访问更改日志,请查找HBASE-3996。
for(company in TableA):
    for(employee in TableB):
        if employee.company_id == company.id:
            emit(company.id, employee)