假設我有豬以下輸入:拆分輸入到子豬(Hadoop的)
some
,我想將其轉換成:
s
so
som
some
我還沒有(還)找到了一種在拉丁語中迭代chararray的方法。我已經找到了TOKENIZE函數,但它在字邊界上分裂。 那麼「豬拉丁」可以這樣做還是這需要Java類來做到這一點?
假設我有豬以下輸入:拆分輸入到子豬(Hadoop的)
some
,我想將其轉換成:
s
so
som
some
我還沒有(還)找到了一種在拉丁語中迭代chararray的方法。我已經找到了TOKENIZE函數,但它在字邊界上分裂。 那麼「豬拉丁」可以這樣做還是這需要Java類來做到這一點?
Niels, TOKENIZE帶有一個分隔符參數,所以你可以使它分開每個字母;但我想不出一種方法來使重疊令牌。
雖然在Pig中編寫UDF非常簡單。您只需實現一個名爲EvalFunc的簡單接口(詳情請見:http://wiki.apache.org/pig/UDFManual)。 Pig是圍繞用戶編寫自己的函數來處理大多數事情的想法而建立的,因此編寫自己的UDF是一件常見的自然事情。
一個更簡單的選擇,雖然效率不高,但是使用Pig流式傳輸來通過腳本傳遞數據(我發現快速的Perl或Python腳本要比實現一次性作業的Java類更快) 。這裏有一個例子: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);
聽起來不錯,這是在0.7.0版本中的新功能? – 2010-06-17 18:32:37