将输入拆分为PIG中的子串(Hadoop)

时间:2009-09-09 14:42:17

标签: hadoop mapreduce apache-pig

假设我在Pig中有以下输入:

some

我想将其转换为:

s
so
som
some

我还没有找到一种方法来迭代猪拉丁语中的chararray。我找到了TOKENIZE函数但是在单词边界上分裂了。 那么“猪拉丁”可以做到这一点,还是需要Java类来做这件事呢?

3 个答案:

答案 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库。

http://hadoop.apache.org/pig/docs/r0.7.0/api/org/apache/pig/piggybank/evaluation/string/SUBSTRING.html

像这样使用:

REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);