2013-09-24 3 views
0

UDF pig latin에 문제가 있습니다. 로컬에 저장된 행렬과 hadoop 리포지토리에 저장된 행렬 집합 사이에 "매핑"이 있는지 확인해야하는 시스템을 구현하려고합니다. 매핑의 경우, 로컬에 저장된 행렬과 동일한 행렬을 변환하는 hadoop에 저장된 행렬의 행과 열의 순열이 존재하는 경우를 의미합니다. 행렬에는 수백 개의 요소가있을 수 있으므로 병렬 처리를 사용하기 위해 hadoop에서 매핑 알고리즘을 실행하려고 생각했습니다. UDF 돼지 라틴어를 찾고 있었지만 UDF 함수에 로컬 행렬을 보내는 방법을 이해하지 못했습니다. udf pig latin에 행렬 보내기

REGISTER /Users/myudfs.jar; 
//SOME CODE TO INITIALIZE ATTRIBUTE matrixToMap 
records = LOAD 'Sample7.txt' //the matrix stored in hadoop 
B = FOREACH records GENERATE myudfs.mapping(records); 

는 돼지 스크립트는 자바 프로그램에서 호출되는 것을 고려하십시오

public class Mapping extends EvalFunc<String> 
{ 
private int[][] matrixToMap; //The local matrix i want to map 

public String exec(Tuple input) throws IOException { //Here the tuple are the matrix stored in hadoop 
    if (input == null || input.size() == 0) 
     return null; 
    try{ 
     //HERE THE CODE FOR THE MAPPING 
    } 

    } 
    } 

}

내가 가진 문제는 내가 matrixToMap이 코드를 사용하는 것을 고려 속성을 초기화 할 수있는 방법입니다 , 로컬 행렬은 자바 행렬에 저장된다는 것을 의미합니다. 그래서 자바 프로그램은 다음과 같습니다 :

int [][] localMatrix; 
pigServer.registerJar("/Users/myudfs.jar"); 
//Some code to make Mapping.matrixToMap = localMatrix 
pigServer.registerQuery("records = LOAD 'Sample7.txt';"); 
pigServer.registerQuery("B = FOREACH records GENERATE myudfs.Mapping(formula);"); 

당신은 어떤 생각이 있습니까? 감사

답변

0
당신은 당신의 UDF의 생성자에서 그와 같은 클래스 변수를 초기화 할 수 있습니다

: 스크립트에서

public class Mapping extends EvalFunc<String> 
{ 
    private int[][] matrixToMap; //The local matrix i want to map 

    public Mapping(String filename) { 
    // Code to populate matrixToMap from the data in filename 
    } 

    public String exec(Tuple input) throws IOException { //Here the tuple are the matrix stored in hadoop 
    if (input == null || input.size() == 0) 
     return null; 
    try{ 
     //HERE THE CODE FOR THE MAPPING 
    } 

    } 
} 

, 다음 줄을 사용하여 매트릭스는해야이 방법을

DEFINE Mapping myudfs.Mapping('/path/to/matrix/on/HDFS'); 

을 HDFS에 저장되므로 초기화되고 생성자를 호출하는 맵퍼 또는 축소 기가 데이터에 액세스 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그래서 내가 이해한다면, 당신은 다음과 같이 제안한다. 1) 로컬 행렬을 hdfs에 저장한다. 2) myudfs.Mapping ('/ path/to/matrix/on/HDFS') 매핑을 정의한다. 3) pigServer.registerJar ("/ Users/myudfs.jar"); 4) pigServer.registerQuery ("records = LOAD 'Sample7.txt';"); – user2811222

+0

Java를 통해 호출하는 방법에 대한 부분을 놓쳤습니다. 이 경우'DEFINE' 문이 평소와 같이 작동하는지 확신 할 수 없습니다. 그러나 한번 사용해보십시오. –