假设我在Pig中有以下输入:
some
我想将其转换为:
s
so
som
some
我还没有找到一种方法来迭代猪拉丁语中的chararray。我找到了TOKENIZE函数但是在单词边界上分裂了。 那么“猪拉丁”可以做到这一点,还是需要Java类来做这件事呢?
答案 0 :(得分:6)
尼尔斯, 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脚本。
答案 1 :(得分:6)
以下是如何在不编写自定义UDF的情况下使用pig streaming和python执行此操作:
假设您的数据只是一列单词。 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);
答案 2 :(得分:5)
使用piggybank库。
像这样使用:
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);