假设我有猪以下输入:拆分输入到子猪(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