2009-09-09 3 views
4

내가 돼지에서 다음과 같은 입력이 있다고 가정) 돼지 라틴어의 문자 배열을 반복하는 방법을 발견했습니다. 내가 TOKENIZE 함수를 발견했지만 그 단어 boundries에 나눕니다. "돼지 라틴어"가이 작업을 수행 할 수 있습니까? 아니면 자바 클래스를 필요로하는이 작업입니까?분할 입력 (하둡)

답변

5

Niels, TOKENIZE는 구분 기호 인수를 사용하므로 각 문자를 분할 할 수 있습니다. 그러나 나는 을 중복하여 토큰을 만드는 방법을 생각할 수 없다.

돼지에서 UDF를 작성하는 것은 매우 간단합니다. EvalFunc라는 간단한 인터페이스 만 구현하면됩니다 (자세한 내용은 http://wiki.apache.org/pig/UDFManual). 돼지는 사용자가 대부분의 것을 처리하기 위해 자신의 기능을 작성한다는 생각을 바탕으로 만들어 졌으므로 자신의 UDF를 작성하는 것이 일반적이며 자연스러운 일입니다.

효율적인 것은 아니지만 돼지 스트리밍을 사용하면 스크립트를 통해 데이터를 전달할 수 있습니다 (일회용 작업을 수행 할 때 Java 클래스를 구현하는 것보다 빠른 Perl 또는 Python 스크립트를 사용하는 것이 더 빠름) . 여기에 예가 있습니다 : http://www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - 기존 라이브러리, Perl 스크립트, UDF 및 심지어는 awk 스크립트를 사용하는 방법을 보여줍니다. 여기

5

는 사용자 정의 UDF를 작성하지 않고 돼지 스트리밍 및 파이썬 함께 할 수있는 방법은 다음과 같습니다

는 데이터 단어의 단지 1 열입니다 가정하자. 파이썬 스크립트 (호출 할 수 있습니다 wordSeq.py)는 일이 될 것이다 처리하는 :

#!/usr/bin/python 
### wordSeq.py ### [don't forget to chmod u+x wordSeq.py !] 
import sys 
for word in sys.stdin: 
    word = word.rstrip() 
    sys.stdout.write('\n'.join([word[:i+1] for i in xrange(len(word))]) + '\n') 

그런 다음, 돼지 스크립트에서, 당신은 당신이 위의 스크립트 및 스크립트를 제공하려는 스트리밍을 사용하는 돼지 이야기 필요한 경우 :

-- wordSplitter.pig --- 
DEFINE CMD `wordSeq.py` ship('wordSeq.py'); 
W0 = LOAD 'words'; 
W = STREAM W0 THROUGH CMD as (word: chararray);