Hadoop实现数据库表关联

Hadoop实现数据库表关联主要有两种方式:Map Side JoinReduce Side Join。本文主要讨论Reduce Side Join的实现与优化。Reduce Side Join是一个完整的MapReduce Job。在Map阶段将来自不同源的原始数据进行区分,对来自不同表的记录构造关联键并将来自不同“表”的记录划分到同一个分组。在Reduce阶段,将来自不同的表记录进行关联。

Reduce阶段,一般将所有记录进行划分(区分该记录来在于哪个数据库表),然后将区分的不同表进行关联。在这种情况下,所有的记录都需要读入到内存,严重的影响程序的效率。在这个阶段,我们可以将程序进行优化:将数据量最大的表排列到最后。在读入内存的时候,只需要将小表保存到内存即可。当遍历到大表时开始进行关联,并将结果进行输出。

为了在Reduce阶段能够区分该条记录是来自数据量较大的表还是来自数据量较小的表,我们需要在Reduce的输入<KeyValue>中进行标记。那么我们思考一下,Map输出的Key应该包含什么呢?其应该主要包含以下几个内容:

1.关联主键

2.来源标记,标记其来源于哪个数据库表

3.大小标记,标记其是属于数据量比较大的表还是数据量比较小的表

仅仅对Key进行修改,还不能达到我们所需要的优化效果。应该我们还需要对Reduce的输入按照小表的数据都在前面而大表的数据都在后面进行排序。只有这样才能够只需要缓存小表。为了达到这个效果我们需要实现两个ComparatorKey进行排序。一个是Sort Comparator,一个是Group ComparatorGroup Comparator主要是对关联主键进行关联,将关联键相同的记录划分到一起。Sort Comparator负责对所有的记录进行排序,首先根据“关联键”进行排序;然后根据“大小标记”进行排序,来自小表的记录排在前面。这样,我们就可以实现对数据库表关联的优化。

具体的代码如下面所示:(程序只是示例,写的不够严谨,仅作说明使用)

*********************************************************************

public class TagedKey implements WritableComparable<TagedKey> {

public Text key;//关联主键

public IntWritable tag;//来源标记

public IntWritable size;//大小标记

.......

}

*********************************************************************

*********************************************************************

public class GroupComparator extends WritableComparator {

public GroupComparator() {

// TODO Auto-generated constructor stub

super(TagedKey.class, true);

}

@Override

public int compare(WritableComparable a, WritableComparable b) {

// TODO Auto-generated method stub

TagedKey key1 = (TagedKey) a;

TagedKey key2 = (TagedKey) b;

return key1.key.compareTo(key2.key);

}

}

*********************************************************************

*********************************************************************

public class OrderComparator extends WritableComparator {

public OrderComparator() {

// TODO Auto-generated constructor stub

super(TagedKey.class, true);

}

@Override

public int compare(WritableComparable a, WritableComparable b) {

// TODO Auto-generated method stub

TagedKey key1 = (TagedKey) a;

TagedKey key2 = (TagedKey) b;

if (key1.key.compareTo(key2.key) != 0) {

return key1.key.compareTo(key2.key);

} else {

return key1.size.compareTo(key2.size);

}

}

}

*********************************************************************

*********************************************************************

job.setSortComparatorClass(OrderComparator.class);

job.setGroupingComparatorClass(GroupComparator.class);

*********************************************************************

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/48c3f54b47f85f9d7e3a33f7ce440cc0.html