在PIG(Hadoop)中将输入拆分成子字符串

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

我希望你能将这个转化为:

s
so
som
some

我还没有找到在pig latin中迭代chararray的方法。我找到了TOKENIZE函数,但它是按单词边界拆分的。 那么“pig latin”能做到这一点吗?还是需要Java类来实现?

3个回答

6

以下是使用pig streaming和Python进行操作的方法,无需编写自定义UDF:

假设您的数据只有一个单词列。用于处理数据的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);

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脚本的用法。

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接