博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop实现数据库表关联
阅读量:6875 次
发布时间:2019-06-26

本文共 2558 字,大约阅读时间需要 8 分钟。

hot3.png

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

你可能感兴趣的文章
全局变量---只创建一次
查看>>
IOS APP上下黑边问题
查看>>
数位dp题集
查看>>
C# 汉字转拼音
查看>>
jquery实现复制的两种方式
查看>>
RPC远程过程调用
查看>>
C++文件操作(fstream)
查看>>
hdu1294 Rooted Trees Problem
查看>>
使用C++模板实现栈的求最小值功能
查看>>
Python网络编程总结
查看>>
在DELL服务器上升级ESXI 5.5
查看>>
UML中组件图
查看>>
Docker容器使用问题:Failed to get D-Bus connection: Operation not permitted
查看>>
【转载】岁月倾尽,黯然诉说一纸神伤
查看>>
虚拟化系列-VMware vSphere 5.1 VDP备份管理
查看>>
三四五线城市真实的互联网
查看>>
sql执行顺序
查看>>
ZooKeeper开发手册中文翻译
查看>>
Oracle体系结构之Oracle分区
查看>>
HDU 2594 Simpsons’ Hidden Talents (KMP)
查看>>