돼지 (Hadoop)의 하위 문자열로 입력 분할
-
05-07-2019 - |
문제
돼지에 다음과 같은 정보가 있다고 가정합니다.
some
그리고 나는 그것을 다음으로 변환하고 싶습니다.
s
so
som
some
나는 (아직) 돼지 라틴어로 chararray를 반복 할 수있는 방법을 찾지 못했습니다. 토큰 화 기능을 찾았지만 단어 경계에 분열됩니다. 그렇다면 "돼지 라틴어"가이 일을 할 수 있습니까?
해결책
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 스크립트의 사용을 보여줍니다.
다른 팁
맞춤 UDF를 쓰지 않고 돼지 스트리밍 및 파이썬으로 수행 할 수있는 방법은 다음과 같습니다.
데이터가 단지 1 개의 단어 열이라고 가정 해보십시오. Python 스크립트 (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);
Piggybank 라이브러리를 사용하십시오.
이렇게 사용하십시오 :
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);