MapReduce程序之实现单表关联

设计思路

分析这个实例,显然需要进行单表连接,连接的是左表的parent列和右表的child列,且左表和右表是同一个表。

  连接结果中除去连接的两列就是所需要的结果——"grandchild--grandparent"表。要用MapReduce解决这个实例,首先应该考虑如何实现表的自连接;其次就是连接列的设置;最后是结果的整理。

考虑到MapReduce的shuffle过程会将相同的key会连接在一起,所以可以将map结果的key设置成待连接的列,然后列中相同的值就自然会连接在一起了。再与最开始的分析联系起来:

  要连接的是左表的parent列和右表的child列,且左表和右表是同一个表,所以在map阶段将读入数据分割成child和parent之后,会将parent设置成key,child设置成value进行输出,并作为左表;再将同一对child和parent中的child设置成key,parent设置成value进行输出,作为右表。为了区分输出中的左右表,需要在输出的value中再加上左右表的信息,比如在value的String最开始处加上字符1表示左表,加上字符2表示右表。这样在map的结果中就形成了左表和右表,然后在shuffle过程中完成连接。reduce接收到连接的结果,其中每个key的value-list就包含了"grandchild--grandparent"关系。取出每个key的value-list进行解析,将左表中的child放入一个数组,右表中的parent放入一个数组,然后对两个数组求笛卡尔积就是最后的结果了

程序代码

import java.io.IOException;

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.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 STjoin
{

public static int time =
0;

/*

* map将输出分割child和parent,然后正序输出一次作为右表,

* 反序输出一次作为左表,需要注意的是在输出的value中必须

* 加上左右表的区别标识。

*/

public static class Map extends Mapper<Object,
Text, Text, Text> {

// 实现map函数

public void map(Object
key, Text value, Context context)

throws IOException,
InterruptedException {

String
line=value.toString();

String[] strs= line.split("\t");

context.write(new Text(strs[1]),new Text("1+"+strs[0]));//输出左表

context.write(new Text(strs[0]),new Text("2+"+strs[1]));//输出右表

}

}

}

public static class Reduce extends Reducer<Text,
Text, Text, Text> {

// 实现reduce函数

public void reduce(Text
key, Iterable<Text> values, Context context)

throws IOException,
InterruptedException {

// 输出表头

if (0
== time) {

context.write(new Text("grandchild"), new Text("grandparent"));

time++;

}

String[] grandchild = null;

            int grandchildnum = 0;

String[] grandparent =
null;

            int grandparentnum = 0;

Iterator iter = values.iterator();

while (iter.hasNext()) {

String record = ite.next().toString();

String[] st=record.split("+");

if(st[0]==1){

grandchild[grandchildnum ]  =st[1];

grandchildnum ++;

} else if(st[0]==2){

grandparent [grandparentnum
]=st[1];

grandparentnum ++;

}

}

// grandchild和grandparent数组求笛卡尔儿积

if (0
!= grandchildnum && 0 != grandparentnum) {

for (int m
= 0; m < grandchildnum; m++) {

for (int n
= 0; n < grandparentnum; n++) {

// 输出结果

context.write(new Text(grandchild[m]), new Text(grandparent[n]));

}

}

}

}

}

public static void main(String[]
args) throws Exception
{

Configuration conf = new Configuration();

// 这句话很关键

conf.set("mapred.job.tracker", "192.168.1.2:9001");

String[] ioArgs = new String[]
{ "STjoin_in", "STjoin_out" };

String[] otherArgs = new GenericOptionsParser(conf,
ioArgs).getRemainingArgs();

if (otherArgs.length !=
2) {

System.err.println("Usage:
Single Table Join <in> <out>");

System.exit(2);

}

Job job = new Job(conf, "Single
Table Join");

job.setJarByClass(STjoin.class);

// 设置Map和Reduce处理类

job.setMapperClass(Map.class);

job.setReducerClass(Reduce.class);

// 设置输出类型

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(Text.class);

// 设置输入和输出目录

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

System.exit(job.waitForCompletion(true)
? 0 : 1);

}

}

时间: 2024-10-14 20:16:00

MapReduce程序之实现单表关联的相关文章

MapReduce应用案例--单表关联

1. 实例描述 单表关联这个实例要求从给出的数据中寻找出所关心的数据,它是对原始数据所包含信息的挖掘. 实例中给出child-parent 表, 求出grandchild-grandparent表. 输入数据 file01: child parent Tom Lucy Tom Jack Jone Lucy Jone Jack Lucy Marry Lucy Ben Jack Alice Jack Jesse Terry Alice Terry Jesse Philip Terry Philip

Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException

简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 改好的代码如下,在reduce阶段遇到了NullPointerException. 1 public class STjoinEx { 2 private static final String TIMES = "TIMES"; 3 4 public static v

MapReduce编程之实现多表关联

多表关联和单表关联类似.它也是通过对原始数据进行一定的处理.从当中挖掘出关心的信息.例如以下 输入的是两个文件,一个代表工厂表,包括工厂名列和地址编号列:还有一个代表地址表,包括地址名列和地址编号列. 要求从输入数据中找出工厂名和地址名的相应关系.输出工厂名-地址名表 样本例如以下: factory: <span style="font-size:14px;">factoryname addressed Beijing Red Star 1 Shenzhen Thunder

MapReduce编程系列 — 5:单表关联

1.项目名称: 2.项目数据: chile    parentTom    LucyTom    JackJone    LucyJone    JackLucy    MaryLucy    BenJack    AliceJack    JesseTerry    AliceTerry    JessePhilip    TerryPhilip    AlimaMark    TerryMark    Alma 3.设计思路: 分析这个实例,显然需要进行单表连接,连接的是左表的parent列

MapReduce单表关联学习~

首先考虑表的自连接,其次是列的设置,最后是结果的整理. 文件内容: import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.ha

案例3,mapreduce单表关联,根据child-parient表解析出grandchild-grandparient表

1.数据样例如下 Tom Lucy Tom Jack Jone Lucy Jone Jack Lucy Mary Lucy Ben Jack Alice Jack Jesse Terry Alice Terry Jesse Philip Terry Philip Alma Mark Terry Mark Alma 2.map的代码如下: public static class ChildParentMapper extends MapReduceBase implements Mapper<Ob

数据库单表关联实现数据计数功能(表格自身关联)

注:本博文为博主原创,转载请注明出处. 问题提出:在数据库中有这样一张表格,其中主要包含三个字段,GoodsId(货物编号),TypeId(类型编号),State(状态).货物编号不重复,GoodsId与TypeId之间属于N对1的关系,State为状态主要分为两种"null"和"1","null"表示该货物未卖出UnSold,"1"表示货物Sold.现在有如下业务,统计出类型编号下有多少货物Sold,多少货物UnSold.

mapreduce-实现单表关联

//map类 package hadoop3; import java.io.IOException; import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper; public class danbiaomap extends Mapper <LongWritable,Text,Text,Text>{ String chi

Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27