与Map Reduce结合

过去几天,我一直在阅读可用于Hadoop的Join实现。 在这篇文章中,我回顾了在此过程中学到的一些技术。 可以根据要连接的数据集的性质在Map端和Join端进行连接。

减少侧面连接

让我们采用包含员工和部门数据的下表。

让我们看看如何使用reduce side join实现下面的join查询。

SELECT Employees.Name, Employees.Age, Department.Name FROM Employees INNER JOIN Department ON Employees.Dept_Id=Department.Dept_Id

映射端负责从每个表中发出联接谓词值以及相应的记录,以便两个表中具有相同部门ID的记录将最终在同一化简器上,然后再进行具有相同部门ID的记录的联接。 但是,还需要标记每个记录以指示记录源自哪个表,以便在两个表的记录之间进行联接。 下图说明了reduce side join过程。

这是此方案的map函数的伪代码。

map (K table, V rec) {

   dept_id = rec.Dept_Id

   tagged_rec.tag = table

   tagged_rec.rec = rec

   emit(dept_id, tagged_rec)

}

在减少侧连接发生在具有不同标签的记录内。

reduce (K dept_id, list<tagged_rec> tagged_recs) {

   for (tagged_rec : tagged_recs) {

      for (tagged_rec1 : taagged_recs) {

          if (tagged_rec.tag != tagged_rec1.tag) {

              joined_rec = join(tagged_rec, tagged_rec1)

          }
       emit (tagged_rec.rec.Dept_Id, joined_rec)

    }

}

地图侧联接(复制联接)

在较小的表上使用分布式缓存

为了使这种实现可行,必须在内存中建立一个关系。 较小的表将复制到每个节点并加载到内存。 联接发生在地图端,而没有reduce的参与,这大大加快了处理速度,因为即使以后不匹配的大多数记录都被删除了,这也避免了整个网络上的所有数据混排。 较小的表可以填充到哈希表中,因此可以完成Dept_Id的查找。 伪代码概述如下。

map (K table, V rec) {

list recs = lookup(rec.Dept_Id) // Get smaller table records having this Dept_Id

for (small_table_rec : recs) {

joined_rec = join (small_table_rec, rec)

}

emit (rec.Dept_id, joined_rec)

}

在筛选表上使用分布式缓存

如果较小的表不适合内存,如果在查询中指定了过滤表达式,则可以修剪表的内容。 考虑以下查询。

SELECT Employees.Name, Employees.Age, Department.Name FROM Employees INNER JOIN Department ON Employees.Dept_Id=Department.Dept_Id WHERE Department.Name="Eng"

通过过滤掉部门名称不是“ Eng”的记录,可以从部门表中导出较小的数据集。 现在,可以使用此较小的数据集进行复制的地图侧联接。

复制半连接

通过地图侧面过滤减少侧面连接

即使小型表的过滤数据不适合内存,也有可能在复制的数据集中仅包含过滤记录的Dept_Id。 然后在地图端,此缓存可用于过滤出记录,这些记录将被发送到缩小端,从而减少了在映射器和约简器之间移动的数据量。

地图侧逻辑如下所示。

map (K table, V rec) {

   // Check if this record needs to be sent to reducer
   boolean sendToReducer = check_cache(rec.Dept_Id)
   if (sendToReducer) {
      dept_id = rec.Dept_Id

      tagged_rec.tag = table

      tagged_rec.rec = rec

      emit(dept_id, tagged_rec)
   }
}

减速器侧逻辑与减速器侧连接情况相同。

使用布隆过滤器

Bloom过滤器是一种可用于测试集合中给定元素的包含性的构造。 如果Dept_Id值可以增加到Bloom Bloom过滤器中,则可以得出过滤后的Dept_ids的较小表示形式。 然后可以将此布隆过滤器复制到每个节点。 在从较小的表中获取的每个记录的映射侧,可以使用Bloom过滤器来检查Bloom过滤器中是否存在该记录中的Dept_Id,并且只有这样才能发出该特定记录以减少面。 因为保证了布隆过滤器不提供假阴性,所以结果将是准确的。

参考:Source Open博客上与我们的JCG合作伙伴 Buddhika Chamith 一起加入Map Reduce


翻译自: https://www.javacodegeeks.com/2012/05/joins-with-map-reduce.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值