您的位置:首页 > 运维架构

使用mapreduce实现多表连接join操作

2015-06-05 10:17 639 查看
(1) 准备小的数据测试集

 输入是两个文件,一个代表工厂表,包含工厂名列和地址编号列;另一个代表地址表,包含地址名列和地址编号列。要求从输入数据中找出工厂名地址名对应关系,输出"地址编号——地址名——工厂名"表。

工厂表

Beijing Red Star,1

Shenzhen Thunder,3

Guangzhou Honda,2

Beijing Rising,1

Guangzhou Development Bank,2

Tencent,3

Back of Beijing,1

地址表

1,Beijing

2,Guangzhou

3,Shenzhen

4,Xian

结果输出如下:

1 Beijing,Beijing Red Star

1 Beijing,Beijing Rising

1 Beijing,Back of Beijing

2 Guangzhou,Guangzhou Honda

2 Guangzhou,Guangzhou Development Bank

3 Shenzhen,Shenzhen Thunder

3 Shenzhen,Tencent

(2)设计思路

   多表关联和单表关联相似,都类似于数据库中的自然连接。相比单表关联,多表关联的左右表和连接列更加清楚。所以可以采用和单表关联的相同处理方式,map识别出输入的行属于哪个表之后,对其进行分割,将连接的列值保存在key中,另一列和左右表标识保存在value中,然后输出。reduce拿到连接结果之后,解析value内容,根据标志将左右表内容分开存放,然后求笛卡尔积,最后直接输出。

目标:用mapreduce框架实现两个表的join连接

(3)代码实现

import java.util.*;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class TableJoin {

public static int time = 0;

/*
* 在map中先区分输入行属于左表还是右表,然后对两列值进行分割,
* 保存连接列在key值,剩余列和左右表标志在value中,最后输出
*/
public static class Map extends Mapper



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息