Hadoop 학습 목록 연결

저는 Hadoop을 공부하고 있습니다. 육가항이 편찬한 Hadoop 실전을 보고 있습니다. 그중에 한 표가 연결된 프로그램이 있습니다. 저는 지금 생각을 정리하고 있습니다.이 문제는 교과서의 예이다.
child-parent표를 제시하고 grandchild-grandparent표를 출력해야 합니다
샘플 입력:
    child parent
    Tom Lucy
    Tom Jack
    Jone Lucy
    Jone Jack
    Lucy Mary
    Lucy Ben 
    Jack Alice
    Jack Jesee
    Terry Alice 
    Terry Jesee
    Philip Terry 
    Philip Alma
    Mark Terry 
    Mark Alma
   
샘플 출력:
    grandChildgrandParent
    TomAlice
    TomJesee
    JoneAlice
    JoneJesee
    TomMary
    TomBen
    JoneMary
    JoneBen
    PhilipAlice
    PhilipJesee
    MarkAlice
    MarkJesee
사실 이 사례는 안의 관건을 납득하기만 하면 여전히 매우 간단하다.
문제풀이 사고방식: 단표 연결을 진행하다
샘플 입력 파일에서child--parent(child)--parent를 볼 수 있습니다. 이렇게 연결하면grandchild--grandparent를 찾을 수 있습니다.
예:
    child    parent
    Tom    Lucy
    Tom   Jack
    Lucy Mary
    Lucy Ben 
    Jack Alice
    Jack Jesee
    
이렇게 하면 우리는 아래의 관계를 쉽게 찾을 수 있다.
    grandchild     grandparent
    Tom                    Mary
    Tom                    Ben
    Tom                    Alice
    Tom                    Jesee
이렇게 연결할 수 있습니다.
표 1: 표 2:
    child    parent           child    parent
    Tom     Lucy               Lucy   Mary
                                        Lucy  Ben 
    Tom    Jack               Jack   Alice
                                       Jack  Jesee
우리는 표1과 표2를 연결한 후에 표1의 2열과 표2의 1열을 제거하고 나머지는 결과이다.
여기서 우리는 사실 시계 1과 시계 2는 하나의 시계인데 이것이 바로 단일 시계의 연결이라는 것을 볼 수 있다
    
여기는 이 시계를 왼쪽 시계와 오른쪽 시계로 설정할 수 있습니다
Map 단계:
읽은 데이터를child와parent로 분할하여 좌우표가 출력된value에 좌우표를 표시할 수 있는 정보를 구분하기 위해 왼쪽 표는parent를key로 하고 왼쪽 표는value를map출력으로 하고 오른쪽 표는value를key로 하고 오른쪽 표는value를value로출력한다.
Map 단계에서 좌우표 구분을 완성했고 shuffle 단계에서 좌우표 연결을 완성했다
Reduce 단계:
(같은 키의 모임, 예를 들어 >)
이렇게 Reduce 단계에서 받은 결과에는 키의value-list에grandchild(left:Tom)와grandparnet(rightTag:Mary,rgihtTag:Ben)의 관계가 포함되어 있으며,value를 해석하고,leftTag표시가 있는grandChild[]수조에 저장하고,rightTag표시가 있는grandParent[]수조에 저장하고,grandChild[]와grandParent[]에 피리를 구하면 됩니다.
프로그램 코드는 다음과 같습니다.
package cn.edu.ytu.botao.singletablejoin;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
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;

/**
 * 
 *     
 * 
 * child   parent
 * Tom      Lucy
 * Tom      Jack
 * Lucy      Mary
 * Lucy      Ben
 * 
 *    :         
 * Lucy  Tom
 * Jack  Tom
 * 
 *               
 * Lucy  Mary
 * Lucy  Ben
 * 
 *    :
 * 
 *  >
 * 
 * @author botao
 *
 */


public class STjoin {
	private static int time = 0;
	public static class STJMapper extends Mapper{
		//   
		private Text leftTag = new Text("1");     //  
		private Text rightTag = new Text("2");   //  
		
		@Override
		protected void map(Object key, Text value,
				Context context)
				throws IOException, InterruptedException {
			// TODO Auto-generated method stub
			
			String childName = new String();
			String parentName = new String();
			//    
			String line = value.toString();
			StringTokenizer tokenizer = new StringTokenizer(line);
			
			//        
			String[] values = new String[2];
			int i = 0;
			while (tokenizer.hasMoreElements()) {
				values[i++] = (String) tokenizer.nextElement();
			}
			
			if (values[0].compareTo("child") != 0) {
				childName = values[0];
				parentName = values[1];
				
				//          value    grandchild
				context.write(new Text(parentName), new Text(leftTag.toString() + ":" + childName));
				//       
				context.write(new Text(childName), new Text(rightTag.toString() + ":" + parentName));
			}
		
		}
		
	}
	
	
	public static class STJoinReduce extends Reducer{

		
		@Override
		protected void reduce(Text key, Iterable values,
				Context context)
				throws IOException, InterruptedException {
			// TODO Auto-generated method stub
			
			//  grandchild       
			int grandChlidNum = 0;
			String[] grandChild = new String[20];
			
			//  grandparent        
			int grandParentNum = 0;
			String[] grandParent = new String[20];
			
			if (time == 0) {
				context.write(new Text("grandChild"), new Text("grandParent"));
				time++;
			}
			
			/**
			 *       values     grandChild[]  
			 *       values      grandParnet[]  
			 */
			for (Text text : values) {
				String value = text.toString();
				//System.out.println(key.toString() + "..." + value);
				String temp[] = value.split(":");
				//System.out.println(key.toString() + "....." + temp[0] + "..." + temp[1]);
				//  
				if (temp[0].compareTo("1") == 0) {
					
					grandChild[grandChlidNum++] = temp[1];
					
					
				}
				
				if (temp[0].compareTo("2") == 0) {
					grandParent[grandParentNum++] = temp[1];
					
				}
				
			}
			
			//  grandChild[]   grandParent[]       
			if (0 != grandChlidNum && 0 != grandParentNum) {
				//System.out.println(grandChlidNum + "..." + grandParentNum);
				for (int i = 0; i  ");
			System.exit(2);
		}

		//   out     ,        
		Path path = new Path("out");
		FileSystem fs = FileSystem.get(conf);
		if (fs.exists(path)) {
			fs.delete(path);
		}
	    
	    
	    Job job = new Job(conf , "STJoin");
	    job.setJarByClass(STjoin.class);
	    job.setMapperClass(STJMapper.class);
	    job.setReducerClass(STJoinReduce.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);
	}	
}

좋은 웹페이지 즐겨찾기