Hadoop实现数据库表关联

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

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

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

1.关联主键

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

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

仅仅对Key进行修改,还不能达到我们所需要的优化效果。应该我们还需要对Reduce的输入按照小表的数据都在前面而大表的数据都在后面进行排序。只有这样才能够只需要缓存小表。为了达到这个效果我们需要实现两个Comparator对Key进行排序。一个是Sort Comparator,一个是Group Comparator。Group 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);

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

转载于:https://my.oschina.net/sdzzboy/blog/164111

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值