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

(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



 
 

你可能感兴趣的:(使用mapreduce实现多表连接join操作)