2009-09-09 61 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);