【问题标题】:Splitting input into substrings in PIG (Hadoop)在 PIG (Hadoop) 中将输入拆分为子字符串
【发布时间】:2010-11-26 21:00:24
【问题描述】:

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

some

我想把它转换成:

s
so
som
some

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

【问题讨论】:

    标签: hadoop mapreduce apache-pig


    【解决方案1】:

    尼尔斯, 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 脚本。

    【讨论】:

      【解决方案2】:

      以下是您可以在不编写自定义 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);
      

      【讨论】:

        【解决方案3】:

        使用 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);
        

        【讨论】:

          猜你喜欢
          • 2023-01-16
          • 2014-09-26
          • 2015-01-16
          • 2019-01-27
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          相关资源
          最近更新 更多