代码之家  ›  专栏  ›  技术社区  ›  Niels Basjes

在pig(hadoop)中将输入拆分为子字符串

  •  5
  • Niels Basjes  · 技术社区  · 16 年前

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

    some
    

    我想把它转换成:

    s
    so
    som
    some
    

    我还没有找到一种迭代pig拉丁语chararray的方法。我发现了tokenize函数,但它在boundries这个词上出现了分裂。 那么,“猪拉丁文”能做到这一点,还是需要Java类来实现呢?

    3 回复  |  直到 15 年前
        1
  •  6
  •   SquareCog    16 年前

    尼尔斯 tokenize接受一个分隔符参数,因此您可以使它拆分每个字母;但是我想不出一种方法使它产生 重叠 令牌。

    不过,用pig编写一个UDF非常简单。您只需实现一个名为evalfunc的简单接口(详细信息如下: http://wiki.apache.org/pig/UDFManual )PIG是围绕着用户编写自己的函数来处理大多数事情的想法而构建的,因此编写自己的UDF是一种常见而自然的事情。

    一个更简单的选择,虽然效率不高,但是使用猪流来通过脚本传递数据(我发现加快Perl或Python脚本的速度比执行一次性任务的Java类要快)。这里有一个例子: http://www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ --它演示了一个预先存在的库、一个Perl脚本、一个UDF,甚至一个动态awk脚本的使用。

        2
  •  6
  •   eytan    16 年前

    以下是在不编写自定义UDF的情况下,如何使用pig流和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')
    

    然后,在您的pig脚本中,您告诉pig您正在使用上述脚本的流式处理,并希望根据需要发送脚本:

    -- wordSplitter.pig ---
    DEFINE CMD `wordSeq.py` ship('wordSeq.py');
    W0 = LOAD 'words';
    W = STREAM W0 THROUGH CMD as (word: chararray);
    
        3
  •  5
  •   Morgan Christiansson    15 年前

    使用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);
    
    推荐文章