【发布时间】:2010-11-26 21:00:24
【问题描述】:
假设我在 Pig 中有以下输入:
some
我想把它转换成:
s
so
som
some
我还没有(还)找到一种方法来迭代猪拉丁语中的字符数组。我找到了 TOKENIZE 函数,但它在单词边界上分裂。 那么“pig latin”可以做到这一点,还是需要 Java 类才能做到这一点?
【问题讨论】:
标签: hadoop mapreduce apache-pig
假设我在 Pig 中有以下输入:
some
我想把它转换成:
s
so
som
some
我还没有(还)找到一种方法来迭代猪拉丁语中的字符数组。我找到了 TOKENIZE 函数,但它在单词边界上分裂。 那么“pig latin”可以做到这一点,还是需要 Java 类才能做到这一点?
【问题讨论】:
标签: hadoop mapreduce apache-pig
尼尔斯, 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 的情况下使用 pig 流和 python 的方法:
假设您的数据只是 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')
然后,在您的 pig 脚本中,您告诉 pig 您正在使用上述脚本进行流式传输,并且您希望在必要时发布您的脚本:
-- 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);
【讨论】: