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.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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;
import java.util.Iterator;
import java.util.Objects;

public class STjoin extends Configured implements Tool {
    public static int time = 0;
  //map将输入分割成child和parent,然后正序输出一次作为右表,反序输出一次作为左表  //需要注意的是在输出的value中必须加上左右表区别标志
    public static class Map extends Mapper<Object,Text,Text,Text>{

        public void map(Object key,Text value,Context context) throws IOException,
                InterruptedException{
            String childname = new String();
            String parentname = new String();
            String relationtype = new String();
            String line = value.toString();
            int i = 0;       //文件以空格分隔
            while(line.charAt(i) != ‘ ‘){
                i++;
            }       //拆分child 和 parent
            String[] values = {line.substring(0,i),line.substring(i+1)};
            if(values[0].compareTo("child") != 0){
                childname = values[0];
                parentname = values[1];         //左右表区分标志
                relationtype = "1";
                context.write(new Text(values[1]),new Text(relationtype + "+" + childname + "+" + parentname));

                relationtype = "2";
                context.write(new Text(values[0]),new Text(relationtype + "+" + childname + "+" + parentname));
            }
        }
    }

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

        public void reduce(Text key,Iterable<Text> values,Context context) throws IOException,InterruptedException{        //输出表头
            if(time == 0){
                context.write(new Text("grandchild"),new Text("grandparent"));
                time++;
            }
            int grandchildnum = 0;
            String grandchild[] = new String[10];
            int grandparentnum = 0;
            String grandparent[] = new String[10];
            Iterator ite = values.iterator();

            while(ite.hasNext()){
                String record = ite.next().toString();
                int len = record.length();
                int i = 2;
                if(len == 0){
                    continue;
                }
                char relationtype = record.charAt(0);
                String childname = new String();
                String parentname = new String();

                while(record.charAt(i) != ‘+‘){
                    childname = childname + record.charAt(i);
                    i++;
                }
                i = i+1;

                while(i<len){
                    parentname = parentname + record.charAt(i);
                    i++;
                }

                if(relationtype == ‘1‘) {
                    grandchild[grandchildnum] = childname;
                    ;
                    grandchildnum++;
                }else{
                    grandparent[grandparentnum] = parentname;
                    grandparentnum++;
                }

            }

            if(grandparentnum != 0 && grandchildnum != 0){
                    for(int m = 0;m<grandchildnum;m++){
                        for(int n = 0;n<grandparentnum;n++){
                            System.out.println(grandchild[m] + "  " + grandparent[n]);
                            context.write(new Text(grandchild[m]),new Text(grandparent[n]));
                        }
                    }
            }

        }
    }

    public  int run(String[] args) throws Exception{
        Configuration aaa = new Configuration();
        Job job = Job.getInstance(aaa);
        String InputPaths = "/usr/local/idea-IC-139.1117.1/Hadoop/out/datainput/child-parent.txt";
        String OutputPath = "/usr/local/idea-IC-139.1117.1/Hadoop/out/dataout/";

        job.setJarByClass(Sort.class);
        job.setJobName("Sort");

        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);
        FileInputFormat.setInputPaths(job, new Path(InputPaths));
        FileOutputFormat.setOutputPath(job, new Path(OutputPath));

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(org.apache.hadoop.mapreduce.lib.output.TextOutputFormat.class);
        boolean success = job.waitForCompletion(true);
        return success ? 0 : 1;

    }

    public static void main(String[] args) throws Exception{
            int ret = ToolRunner.run(new STjoin(), args);
            System.exit(ret);
    }
}

输出结果:

参考:《Hadoop实战》

时间: 2024-10-25 00:52:47

MapReduce单表关联学习~的相关文章

案例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

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程序之实现单表关联

设计思路 分析这个实例,显然需要进行单表连接,连接的是左表的parent列和右表的child列,且左表和右表是同一个表. 连接结果中除去连接的两列就是所需要的结果--"grandchild--grandparent"表.要用MapReduce解决这个实例,首先应该考虑如何实现表的自连接:其次就是连接列的设置:最后是结果的整理. 考虑到MapReduce的shuffle过程会将相同的key会连接在一起,所以可以将map结果的key设置成待连接的列,然后列中相同的值就自然会连接在一起了.再

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

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

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

注:本博文为博主原创,转载请注明出处. 问题提出:在数据库中有这样一张表格,其中主要包含三个字段,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

Hibernate单表映射学习笔记之一——hibernalnate开发环境配置

1.什么是ORM? Object/Relationship Mapping:对象/关系映射 2.写SQL语句不好之处: (1)不同数据库使用的SQL语法不同(PL/SQL.T/SQL) (2)同样的功能在不同的数据库中有不同的实现方式(分页SQL) (3)过分依赖SQL语句对程序的移植和拓展不利 3.Hibernate (1)ORM框架技术 (2)对JDBC进行了非常轻量的对象封装 4.其他ORM框架技术 (1)Mybatis(前身为iBatis) (2)Toplink(现为Oracle As

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

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