Hadoop MapReduce單表關聯程式_Hadoop

來源:互聯網
上載者:User
package com.hadoop.sample;    import java.io.IOException;  import java.util.Iterator;  import java.util.StringTokenizer;    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 {      private 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++;              }              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();                  //擷取value-list中value的child                  while(record.charAt(i) != '+'){                      childname = childname + record.charAt(i);                      i++;                  }                  i = i+1;                  //擷取value-list中value的parent                  while(i<len){                      parentname = parentname + record.charAt(i);                      i++;                  }                  //左表,取出child放入grandchild                  if(relationtype == '1'){                      grandchild[grandchildnum]=childname;                      grandchildnum++;                  }else{//右表,取出parent放入grandparent                      grandparent[grandparentnum]=parentname;                      grandparentnum++;                  }                                }              //grandchild和grandparent數組求笛卡爾積              if(grandparentnum!=0&&grandchildnum!=0){                  for(int m=0;m<grandchildnum;m++){                      for(int n=0;n<grandparentnum;n++){                          context.write(new Text(grandchild[m]), new Text(grandparent[n]));                      }                  }              }          }      }      /**      * @param args      */      public static void main(String[] args) throws Exception{          // TODO Auto-generated method stub          Configuration conf = new Configuration();          String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();          if(otherArgs.length != 2){              System.err.println("Usage WordCount <int> <out>");              System.exit(2);          }          Job job = new Job(conf,"single table join");          job.setJarByClass(STJoin.class);          job.setMapperClass(Map.class);          job.setCombinerClass(Reduce.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);      }    } 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.