2010-04-27 1 views
0

두 봉지 사이의 최소 중심을 계산하려고하는 돼지 프로그램이 있습니다. 작동시키기 위해서, 가방을 하나의 데이터 세트로 묶어야한다는 것을 알았습니다. 전체 작업에는 오랜 시간이 걸립니다. 기본적으로Yahoo PigLatin UDF 내에서 파일을 DataBag에로드하려면 어떻게해야합니까?

# **** Load files for iteration **** 
register myudfs.jar; 
wordcounts = LOAD 'input/wordcounts.txt' USING PigStorage('\t') AS (PatentNumber:chararray, word:chararray, frequency:double); 
centerassignments = load 'input/centerassignments/part-*' USING PigStorage('\t') AS (PatentNumber: chararray, oldCenter: chararray, newCenter: chararray); 
kcenters = LOAD 'input/kcenters/part-*' USING PigStorage('\t') AS (CenterID:chararray, word:chararray, frequency:double); 
kcentersa1 = CROSS centerassignments, kcenters; 
kcentersa = FOREACH kcentersa1 GENERATE centerassignments::PatentNumber as PatentNumber, kcenters::CenterID as CenterID, kcenters::word as word, kcenters::frequency as frequency; 

#***** Assign to nearest k-mean ******* 
assignpre1 = COGROUP wordcounts by PatentNumber, kcentersa by PatentNumber; 
assignwork2 = FOREACH assignpre1 GENERATE group as PatentNumber, myudfs.kmeans(wordcounts, kcentersa) as CenterID; 

: 나도 열어 UDF 내 디스크에서 가방 하나, 또는 COGROUP 필요없이 UDF에 다른 관계를 통과 할 수 있도록 ......

코드에 원하는 내 문제는 각 특허에 대해 하위 관계 (단어 수, kcenters)를 전달해야한다는 것입니다. 이렇게하기 위해서, 나는 PatentNumber, {wordcounts}, {kcenters}를 얻기 위해 PatentNumber에 의해 십자가를 그리고 COGROUP을 수행했다. 관계를 전달하거나 UDF 내에서 센터를 여는 방법을 파악할 수 있다면 PatentNumber를 통해 GROUP 단어 수를 계산하고 myudfs.kmeans (단어 수)를 실행하면 CROSS/COGROUP없이 훨씬 빠를 것입니다.

이것은 값 비싼 작업입니다. 현재 이것은 약 20 분이 소요되며 CPU/RAM을 압박하는 것처럼 보입니다. 나는 그것이 CROSS없이 더 효율적일지도 모른다고 생각하고있었습니다. 나는 그것이 더 빠를 것이라고 확신하지 못하기 때문에 실험하고 싶습니다.

어쨌든 Pig에서로드 기능을 호출하는 것은 evalfunc에서 가져 오지 않은 PigContext 객체가 필요합니다. 그리고 hadoop 파일 시스템을 사용하기 위해서는 몇 가지 초기 객체가 필요합니다. 나는 얻는 방법을 알지 못합니다. 그래서 내 질문에 어떻게 PIG UDF 내에서 hadoop 파일 시스템에서 파일을 열 수 있습니까? 또한 디버깅을 위해 main을 통해 UDF를 실행합니다. 그래서 디버그 모드에서 일반 파일 시스템에서로드해야합니다.

CROSS/COGROUP 없이도 관계를 UDF에 전달할 수있는 방법이 있다면 더 좋은 아이디어입니다. 이것은 관계가 메모리에 상주하는 경우 이상적입니다. 즉, kcenters가있는 CROSS/COGROUP을 필요로하지 않고 myudfs.kmeans (단어 수, kcenters)를 수행 할 수 있습니다 ...

하지만 기본적인 아이디어는 IO를 교환하는 것입니다. RAM/CPU주기.

어쨌든 도움이 될 것입니다, PIG UDF는 UDF 설명서에서도 가장 간단한 것 이상으로 잘 문서화되어 있지 않습니다.

+0

+1 좋은 질문 목록을 이메일을 보내 주시기 바랍니다! 너 무슨 일 했니? 아직도 nosql 작업 중이십니까? –

답변

1

Cervo, piggybank에는 LookupInFiles라고하는 것보다 더 많거나 적은 것을하는 UDF가 있습니다. 소스 코드를 확인하십시오. 필요에 맞게 변환해야합니다. 당신이 문서의 제안을 다른 문제가있는 경우

http://svn.apache.org/viewvc/hadoop/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/string/LookupInFiles.java

+0

그건 기본적으로 어떻게 끝났어 ... FileLocalizer.openDFSFile (파일 이름, UDFContext.getUDFContext(). getUDFProperties (myudf.class)) 존재 여부를 테스트하려면, part-0000, .. part-0009). 나는 FileExists 등등을 사용할 수 있었기 때문에 작동하는 DataStorage 또는 PigContext 객체를 얻는 방법을 알고 싶었지만 .... – Cervo