5

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

some

我想将其转换为:

s
so
som
some

我还没有(还)找到一种方法来迭代猪拉丁语中的字符数组。我找到了 TOKENIZE 函数,但它在单词边界上分裂。那么“pig latin”可以做到这一点,还是需要Java类才能做到这一点?

4

3 回答 3

6

以下是在不编写自定义 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);
于 2009-11-13T08:59:31.207 回答
6

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 脚本。

于 2009-09-09T16:10:01.133 回答
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);
于 2010-06-17T16:36:50.640 回答