2009-09-09 66 views
4

假設我有豬以下輸入:拆分輸入到子豬(Hadoop的)

some 

,我想將其轉換成:

s 
so 
som 
some 

我還沒有(還)找到了一種在拉丁語中迭代chararray的方法。我已經找到了TOKENIZE函數,但它在字邊界上分裂。 那麼「豬拉丁」可以這樣做還是這需要Java類來做到這一點?

回答

5

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腳本的使用。

5

這裏是你如何與豬流和蟒蛇做沒有編寫自定義的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);