减少侧面连接
让我们采用包含员工和部门数据的下表。
让我们看看如何使用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